我正在运行for循环,在每次迭代中,我在后台执行一个SwingWorker(持续约5分钟)。 我有一个属性,它是同时在后台运行的Worker的数量。
for循环有100次迭代,但我只想运行5个同时运行的SwingWorker。如果同时运行的工作人员的数量超过5,我该如何暂停循环迭代?当它变得更低时我怎么能恢复呢?
谢谢。
答案 0 :(得分:2)
通常我使用带有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();
}
}
答案 1 :(得分:1)
查看以下有关SwingWorker限制和监控的博客。它解释了如何定义M个并发线程来执行N个任务。
基本上你必须创建一个线程池并让它来管理你的工人的执行。
http://blogs.oracle.com/swinger/entry/swingworker_throttling_and_monitoring
答案 2 :(得分:0)
假设for循环除了执行SwingWorkers之外没有做任何其他事情,一种方法是只向TCPPoolExecutor提交100个任务,并将池大小设置为5。