gpt4 book ai didi

java - 线程上可运行对象的受监督调用

转载 作者:行者123 更新时间:2023-12-02 07:50:57 25 4
gpt4 key购买 nike

好吧,我会举一个例子来解释我要问的问题。

假设我正在尝试实现并行合并算法:

db 是一个数组,其中 db[i] 是对象的 ArrayList。

j 是它的大小。Merger(db,cmp,i,j) 是一个可运行程序,它将 db[ j ] 合并到 db[i].

cmp 是一个相关的比较器。

这是我首先完成的事情:

    ExecutorService e =  Executors.newFixedThreadPool(3);
while (j>0)
for ( i=0;i<j;i++,j--)
e.execute(new Merger<E>(db,cmp,i,j));

但是随后开始了一些合并,而之前需要先完成的合并尚未完成。 (更不用说正在运行的线程在合并完成之前完成了循环......)这使得我的程序抛出异常。

这是我不能做但想做的事情,因此需要您的帮助:

    ExecutorService e =  Executors.newFixedThreadPool(3);
while (j>0) {
for ( i=0;i<j;i++,j--)
e.execute(new Merger<E>(db,cmp,i,j));
wait for e to announce that all runnables have finished running;
}

在我看来,这应该可行,如果您认为不行,请解释原因,但无论如何,我想知道它是如何完成的。

(基本上我可以实现我自己的FixedThreadPool版本来使其变得成功,但我不愿意)

最佳答案

您可能正在寻找CountDownLatch :

  • 确定需要等待的线程数,并使用该数字创建一个 CountDownLatch
  • 在构造所有工作线程时将闩锁传递给它们,并让它们在完成后调用 countDown()
  • 在将工作线程排入队列的循环之后,await() 倒计时达到零。

关于java - 线程上可运行对象的受监督调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10234785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com