0

在常见的 workQueue 即 adPoolExecution 架构中,当一个作业到达时,只调用一个线程并由该线程完成工作。相反,我希望所有线程都被调用并且所有线程都执行任务。

我的情况如下。我有 5000 个数据项,我必须对每个数据项运行一个任务。事实证明,一个一个运行它很慢,因此我想在这里使用线程。这里假设我使用了 5 个线程。第一个线程将执行前 1000 个数据项,第二个线程将执行接下来的 1000 个数据项,其他将紧随其后。现在,当需要在这 5000 个数据项上执行的作业到达时,必须调用所有 5 个线程,或者更确切地说,将其从睡眠状态中恢复,以便它可以执行其任务。

这怎么可能在 java 中使用 theadPoolExecution。我知道将同一作业的 5 个副本插入队列可能会有所帮助。但这有很多副作用,比如如果一个线程快速完成它的工作,它将占用其他人的工作。

谢谢 Vineeth

4

2 回答 2

1

由于您希望第一个线程处理前 1000 个项目,而第二个线程处理另外 1000 个项目,这意味着您希望线程执行不同的任务。相反,如果所有线程都执行相同的任务,这意味着所有线程都执行相同的数据项(这是没有用的,并且当线程将结果保存到同一个位置时可能会导致问题)。

所以请不要“插入5份相同的工作”。提交具有不同数据范围的不同任务。

    for (int k=0; k<N; k+=1000) {
       final int datapoint=k;
       executor.execute(new Runnable() {
           processDataRange(datapoint, datapoint+1000);
       });
    }

在循环的每一次通过中,都会创建具有不同参数的新任务并将其提交给执行程序。

于 2012-11-24T04:16:26.730 回答
0

您可以在示例中使用计数为 5 的CountDownLatch,这样您就可以在所有线程调用各自countDown的 s 之后执行任何您需要的操作。

于 2012-11-23T03:49:05.663 回答