[英]Threads and a splash screen
我有一個應用程序,在將GUI呈現給用戶之前,它依賴於從N個文件創建某些對象的過程。 我決定創建一個初始屏幕,並希望顯示一個進度條,以估計應用程序完成其初始任務的進度。
我剛剛開始研究java.util.concurrent API,正在考慮通過使用CountDownLatch和FutureTask解決此問題:為每個需要讀取的文件創建FutureTask並獲取構造的對象; 使用CountDownLatch既可以確保在完成初步任務之前不顯示GUI,還可以注冊進程距離(通過查詢getCount()並相應地在初始屏幕圖像上繪制狀態欄)。
這是矯kill過正嗎?
信號量更好,因為您可以在啟動期間重用任務的線程
使用s = new Semaphore(-nbFiles+1)
創建信號量,並在完成文件操作后讓每個任務調用s.release()
啟動屏幕可以知道使用nbFiles + s.availablePermits()進行的所有操作
我將創建一個CountDownLatch ,該計數器用在顯示UI之前需要執行的任務數進行初始化。
然后,我將使用固定線程池,向其發布類似於以下內容的任務:
public class Task implements Runnable {
CountDownLatch latch;
public Task(CountDownLatch latch) {
this.latch = latch;
}
public void run() {
//First perform some business logic... then
latch.countDown();
}
}
監視線程(請注意,此線程不應由UI線程執行)應執行以下操作:
public void monitorProgress(final CountDownLatch latch) {
while (latch.await(5, TimeUnit.SECONDS) == false) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// update the progress, latch.getCount() tasks are remaining
}
});
}
//Execution has been completed once you reach this line..
}
請注意,該代碼未經測試,也可能無法編譯,但是它說明了您想要執行的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.