Java 线程和启动屏幕
我有一个应用程序,它依赖于在GUI呈现给用户之前从N个文件创建某些对象。我已经决定创建一个启动屏幕,并希望显示一个进度条,给出应用程序在初始任务方面的进度估计 我刚刚开始研究java.util.concurrent API,我正在考虑使用CountDownLatch和FutureTask来解决这个问题:为需要读取的每个文件创建一个FutureTask,并获取构造的对象;使用CountDownLatch既可以确保在初步任务完成之前不显示GUI,也可以注册我们在流程中的位置(通过查询getCount()并相应地在启动屏幕的图像上重新绘制状态栏) 这是不是太过分了?a更好,因为您可以允许在启动期间重用任务的线程 使用Java 线程和启动屏幕,java,concurrency,splash-screen,Java,Concurrency,Splash Screen,我有一个应用程序,它依赖于在GUI呈现给用户之前从N个文件创建某些对象。我已经决定创建一个启动屏幕,并希望显示一个进度条,给出应用程序在初始任务方面的进度估计 我刚刚开始研究java.util.concurrent API,我正在考虑使用CountDownLatch和FutureTask来解决这个问题:为需要读取的每个文件创建一个FutureTask,并获取构造的对象;使用CountDownLatch既可以确保在初步任务完成之前不显示GUI,也可以注册我们在流程中的位置(通过查询getCount
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的经验:)