线程和启动画面

时间:2011-05-20 15:44:31

标签: java concurrency splash-screen

我有一个应用程序依赖于在向用户呈现GUI之前从N个文件创建某些对象。我决定创建一个启动画面,并希望显示一个进度条,估计应用程序在初始任务中取得的进展。

我刚刚开始研究java.util.concurrent API并且正在考虑通过使用CountDownLatch和FutureTask来解决这个问题:为每个需要读取的文件创建FutureTask并获取构造的对象;使用CountDownLatch来确保在初步任务完成之前不显示GUI并注册我们在进程中的距离(通过查询getCount()并相应地在启动屏幕的图像上重绘状态栏。

这是否过度?

2 个答案:

答案 0 :(得分:1)

semaphore更好,因为您可以允许在启动期间重用任务的线程

使用s = new Semaphore(-nbFiles+1)创建信号量,并在完成文件后让每个任务调用s.release()

启动画面可以通过nbFiles + s.availablePermits()

知道所有进展的进展情况

答案 1 :(得分:0)

我会创建一个CountDownLatch,它会在您显示UI之前使用您需要执行的任务数进行初始化。

然后我会使用例如fixed thread pool我发布类似于以下任务的任务:

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..
}

请注意,代码未经过测试,可能无法编译,但它说明了您要执行的操作。