Java线程池同步

4
我希望能够使用Java执行以下算法。
for(int i = 0; i< 100; i++){
    create 8 threads which perform a task
    wait for all threads to finish
}

希望尽量避免因开销而频繁创建和销毁线程(每个线程的工作时间不到20毫秒),因此引入了线程池的概念1。我知道可以使用Executable2,调用shutdown,然后等待awaitTermination。但是在这种情况下,由于循环,这样做是不可取的。那么如何实现线程同步呢?
我想在线程池中实现线程同步,就像使用传统线程的join()方法一样。

1
问题不够清晰。您是创建了100个8个线程,还是在8个线程中处理100个任务?您需要同步什么(您需要同步数据,而不是线程)? - toto2
你确定在开始新任务之前必须等待所有8个任务完成吗?如果你想要8个线程,因为你有一台8核心的机器,那么你只需要使用一个8线程的线程池。 - toto2
3个回答

5
你试过查看循环屏障吗?它被优化为允许一组线程停止并等待,直到每个线程都到达公共屏障。我认为如果使用已知数量的池化线程和对公共屏障的引用,就可以使用它。如果需要在调用回调时同步等待await()计数到达,则可能会增加一些额外复杂性,因为它在不同的线程中执行。

谢谢,这看起来非常有帮助。我将尝试将循环屏障与线程池耦合,并发布我的结果。然而,我想指出你的假设是错误的,我并不是对功能感兴趣,我只是想通过线程使我的应用程序更快,并需要同步。 - ET13

2

你需要把所有的任务放入队列中,然后将队列交给ThreadPoolExecutor。你告诉线程池执行器使用多少个线程,它会负责执行这些任务。


然而,这并没有解决同步的问题,如果我没记错的话? - ET13
如果你真的需要这样做(如果是这样,为什么你的任务列表不是8的倍数?),你可以将作业以每次8个的方式放入任务队列,并覆盖ThreadPoolExecutor.afterExecute()方法来检查是否所有任务都已完成,如果是,则再添加另外8个到队列中。 - TMN

0

看一下JDK 7的fork/join框架。


谢谢,我之前在这里(http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html)读过关于Fork/Join框架的内容,但是我被劝阻使用它,因为它适用于递归算法,而我要实现的算法更容易以迭代方式实现。此外,我有一个固定数量的线程希望运行,而这个算法更适合将任务分成小单位并允许Fork/Join根据需要最佳地利用资源。 - ET13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接