我正在運行一個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
池大小的一種方式什麼