Java - 定相线程

时间:2011-06-24 13:40:10

标签: java multithreading

我正在实现一个具有多个线程的并行,性能关键的算法。我为所有线程分配一些数据来处理。当所有那些线程已完成处理其数据时,我为所有线程分配新数据,并继续循环。 (这就是我所说的线程“时钟”,因为它有点类似于CPU时钟。)

到目前为止,我想到的是使用存储整数的主线程。在每个循环的开始,我将整数设置为从属线程的数量。完成从属线程后,它会减少主线程的整数。一旦该整数达到零,我就开始一个新的循环。

这是一个好方法,还是有更有效的方法来做同样的事情?

5 个答案:

答案 0 :(得分:3)

我建议查看java.util.concurrent包中的较新类,尤其是ThreadPoolTaskExecutor。如果你没有超越java.lang.Thread,你可能会重新发明轮子。

答案 1 :(得分:3)

最好使用Phaser(如果你有Java 7),或CyclicBarrier用于Java 5 +。

答案 2 :(得分:0)

好。请参阅CyclicBarrier(JavaDoc

答案 3 :(得分:0)

更好的方法是使用Thread.join()。在你的主线程中,你在你正在开始的所有线程上调用join()。主线程将等待,直到所有连接的线程都完成。

参见例如http://javahowto.blogspot.com/2007/05/when-to-join-threads.html

答案 4 :(得分:0)

ExecutorService可以为您完成此操作。

ExecutorService executor = Executors.newFixedThreadPool(10);

do {
  List<Callable> tasks = getNextTasksToExecute();
  executor.invokeAll(tasks);
} while (tasks.size() > 0);

这将创建一个包含10个线程的线程池。然后它将调用您应该自己实现的getNextTasksToExecute()以返回下一组需要执行的任务。它将在线程池中并行执行这些任务,然后继续循环,直到getNextTasksToExecute()不再返回任务。

编辑:
代码未经过测试,认为可能存在编译错误,但您可以解决这个问题。