我正在运行一个for循环,并且在每次迭代中,我在后台执行一个SwingWorker(大约持续5分钟)。 我有一个属性是谁在同一时间在后台运行的工人数。Java在循环中暂停
for循环有100次迭代,但我只想运行5个simulutaneous SwingWorker。如果同时工作的人数超过5,我该如何暂停循环迭代?当它变得更低时我该如何恢复它?
谢谢。
我正在运行一个for循环,并且在每次迭代中,我在后台执行一个SwingWorker(大约持续5分钟)。 我有一个属性是谁在同一时间在后台运行的工人数。Java在循环中暂停
for循环有100次迭代,但我只想运行5个simulutaneous SwingWorker。如果同时工作的人数超过5,我该如何暂停循环迭代?当它变得更低时我该如何恢复它?
谢谢。
通常我用5个线程的ExecutionService做到这一点。但是你可以像这样使用信号量。
final Semaphore permits = new Semaphore(5);
for(int i=0;i<100;i++) {
permits.acquire();
// add a task
}
// in the SwingWorker
public String doInBackground() {
try {
return findTheMeaningOfLife();
} finally {
permits.release();
}
}
查阅以下关于SwingWorker限制和监控的博客。它解释了如何定义M个并发线程来执行N个任务。
基本上你必须创建一个线程池,让它来管理你的工作者的执行。
http://blogs.oracle.com/swinger/entry/swingworker_throttling_and_monitoring
假设的循环不会做其他不是执行你的SwingWorkers,要做到这一点是刚刚提交100个任务到ThreadPoolExecutor的设置为5
池大小的一种方式什么