我有一个应用程序依赖于在向用户呈现GUI之前从N个文件创建某些对象。我决定创建一个启动画面,并希望显示一个进度条,估计应用程序在初始任务中取得的进展。
我刚刚开始研究java.util.concurrent API并且正在考虑通过使用CountDownLatch和FutureTask来解决这个问题:为每个需要读取的文件创建FutureTask并获取构造的对象;使用CountDownLatch来确保在初步任务完成之前不显示GUI并注册我们在进程中的距离(通过查询getCount()并相应地在启动屏幕的图像上重绘状态栏。
这是否过度?
答案 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..
}
请注意,代码未经过测试,可能无法编译,但它说明了您要执行的操作。