簡體   English   中英

線程和啟動畫面

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM