作业到达threadPoolExecution时调用所有线程

时间:2012-11-23 01:45:34

标签: java multithreading threadpoolexecutor

在常见的workQueue,theadPoolExecution体系结构中,当作业到达时,只调用一个线程并且该线程完成工作。 相反,我希望调用所有线程以及执行任务的所有线程。

我的情景如下。 我有5000个数据项,我必须在每个数据项上运行任务。逐个运行它已经证明很慢,因此我想在这里使用线程。 这里可以说我使用了5个线程。第一个线程将执行前1000个数据项,第二个将执行下一个1000,其他将跟随。 现在当一个作业到达需要对这5000个数据项执行时,所有5个线程都必须被调用或者从睡眠状态恢复,以便它可以执行它的任务。

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

由于       比涅斯

2 个答案:

答案 0 :(得分:1)

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

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

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

在循环的每次传递中,创建具有不同参数的新任务并将其提交给执行者。

答案 1 :(得分:0)

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