【发布时间】:2010-11-16 21:08:52
【问题描述】:
我正在使用 Java 6。
假设我创建了 100 个线程,每个线程完成一项任务。我想一次连续运行 10 个线程。这意味着如果我正在运行线程 1-10,并且线程 8 完成,我希望能够立即启动线程 11,而无需等待 1-10 加入。
我该怎么做?
解决这个问题的一种方法可能是使用 isAlive() 方法,但我想知道是否可以不进行轮询。
谢谢。
【问题讨论】:
标签: java multithreading
我正在使用 Java 6。
假设我创建了 100 个线程,每个线程完成一项任务。我想一次连续运行 10 个线程。这意味着如果我正在运行线程 1-10,并且线程 8 完成,我希望能够立即启动线程 11,而无需等待 1-10 加入。
我该怎么做?
解决这个问题的一种方法可能是使用 isAlive() 方法,但我想知道是否可以不进行轮询。
谢谢。
【问题讨论】:
标签: java multithreading
为什么需要这样做?
更好的方法是创建一个包含 10 个线程的池并向其中提交 100 个任务。它将产生完全相同的效果 - 100 个任务中有 10 个同时运行。
ExecutorService pool = Executors.newFixedThreadPool(10);
for (int i = 0; i < 100; i++)
pool.submit(...);
【讨论】:
使用具有 10 个线程的 ExecutorService 线程池来提交任务。你 summit 的任何作业都将在 q Queue 中结束,10 个线程将执行你的 1000 个作业。
【讨论】:
当你在谈论并发时说“一次”是令人困惑的。如果您使用线程池大小为 10 的 ExecuterService,则将启用 100 个线程中的 10 个来执行。但是请记住,如果您只有 1 个 CPU 并且您的一个线程具有更高的优先级,则所有其他线程可能会保持等待状态。 我的建议是根据可用的 CPU 数量调整线程数。
【讨论】: