Java的线程池同步

问题描述:

我想执行下面的算法 - 这必须用Java做Java的线程池同步

for(int i = 0; i< 100; i++){ 
    create 8 threads which perform a task 
    wait for all threads to finish 
} 

希望的是,线程不会继续创建和销毁由于管理费用(而事实上,每个线程将会有20milli秒的工作),这带来了线程池1的想法。我也知道使用可执行文件2,可以调用shutdown,然后等待终止。然而,在这种情况下由于循环而不可取。那么线程同步如何发生?

我想同步线程池中的线程,就像使用传统线程的join()方法所做的那样。

+1

问题不明确。您创建100次8个线程或者您在8个线程中处理100个任务?你需要同步什么(你同步数据,而不是线程)? – toto2

+0

您确定在开始新任务之前您必须等待所有8个任务完成吗?如果你需要8个线程,因为你有一个8核心的机器,那么你只需要使用一个8线程的ThreadPool。 – toto2

你试过看过Cyclic Barrier。它被优化为允许一组线程停下来等待,直到每个人都达到共同的障碍。我看不出有什么理由说明为什么它不能与已知数量的共用线程一起使用并引用共同障碍。如果您需要在与障碍await()调用的回调中进行同步,则可能会有一些额外的复杂性,因为它在不同的线程中执行了计数。

+0

谢谢,这看起来很有帮助。我将尝试将循环屏障与线程池耦合并发布我的结果。不过,我想指出的是,假设我对功能感兴趣是错误的,我只需要一个应用程序,我希望通过需要同步的线程来加快速度。 – ET13

看一看叉/加入JDK 7

+0

谢谢,我已阅读过此处的Fork/Join Framework(http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html),但因为它旨在用于递归而被阻止使用它算法,而我试图实现的算法更容易迭代实现。另外我有一个固定数量的线程,我希望这个线程能够运行,而这个算法更适合于将任务分成小部分工作单元,并允许Fork/Join相应地确定如何最好地使用资源。 – ET13

你需要坚持队列中的所有任务,然后喂队列为ThreadPoolExecutor的框架。您告诉线程池执行程序要使用多少个线程,并负责执行任务。

+0

但是这并不能解决同步的问题,如果我没有弄错的话? – ET13

+0

如果您确实需要它(如果是这样,为什么您的任务列表不是8的倍数?),您可以一次将任务放入任务队列8中并覆盖'ThreadPoolExecutor.afterExecute()'以检查是否所有任务已经完成,如果有的话,再增加8个队列。 – TMN