在常见的workQueue、adPoolExecution架构中,当一个作业到达时,只有一个线程被调用,并且该线程完成工作。 相反,我希望调用所有线程并让所有线程执行任务。
我的场景如下。 我有 5000 个数据项,我必须对每个数据项运行一个任务。事实证明,一一运行它很慢,因此我想在这里使用线程。 假设我使用了 5 个线程。第一个线程将执行前 1000 个数据项,第二个线程将执行接下来的 1000 个数据项,其他线程将依次执行。 现在,当需要对这 5000 个数据项执行的作业到达时,必须调用所有 5 个线程,或者更确切地说,将其从 sleep 状态恢复,以便它可以执行其任务。
在 java 中使用 theadPoolExecution 是如何实现这一点的? 我知道将同一作业的 5 个副本插入队列可能会有所帮助。 但这有很多副作用,例如如果一个线程快速完成其工作,它将占用其他人的工作。
谢谢 维尼思
最佳答案
由于您希望第一个线程处理前 1000 个项目,第二个线程处理另外 1000 个项目,这意味着您希望线程执行不同的任务。相反,如果所有线程执行相同的任务,则意味着所有线程执行相同的数据项(这没有用,并且当线程将结果保存到相同位置时可能会导致问题)。
所以,请不要执行“插入同一作业的 5 个副本”。提交不同的任务,具有不同的数据范围。
for (int k=0; k<N; k+=1000) {
final int datapoint=k;
executor.execute(new Runnable() {
processDataRange(datapoint, datapoint+1000);
});
}
在循环的每次传递中,都会创建具有不同参数的新任务并将其提交给执行器。
关于java - 当作业到达 threadPoolExecution 时调用所有线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13522195/