Java 线程和启动屏幕

Java 线程和启动屏幕,java,concurrency,splash-screen,Java,Concurrency,Splash Screen,我有一个应用程序,它依赖于在GUI呈现给用户之前从N个文件创建某些对象。我已经决定创建一个启动屏幕,并希望显示一个进度条,给出应用程序在初始任务方面的进度估计 我刚刚开始研究java.util.concurrent API,我正在考虑使用CountDownLatch和FutureTask来解决这个问题:为需要读取的每个文件创建一个FutureTask,并获取构造的对象;使用CountDownLatch既可以确保在初步任务完成之前不显示GUI,也可以注册我们在流程中的位置(通过查询getCount

我有一个应用程序,它依赖于在GUI呈现给用户之前从N个文件创建某些对象。我已经决定创建一个启动屏幕,并希望显示一个进度条,给出应用程序在初始任务方面的进度估计

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

这是不是太过分了?

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

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

启动屏幕可以知道nbFiles+s的进展情况。availablePermits()

我将创建一个初始化,使用显示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..
}

请注意,代码没有经过测试,也可能没有编译,但它说明了您想要做什么。

如果我使用Runnable的实现而不是FutureTask,那么如果抛出异常,我如何从文件读取线程进行通信?您从未提过您想要这样做,但您可以通过多种方式解决该问题使用callable而不是Runnable并返回一个结果,或者让Runnable将结果发布到监视器或其他东西。好的,我没有想过使用信号量,因为我认为它可以绑定一些资源的消费者。我不确定我是否理解为什么信号量更好的部分。需要更多使用java.util.concurrent的经验:)