实现java FixedTreadPool状态监听器

时间:2010-05-14 06:31:02

标签: java multithreading progress-bar

这是一个应用程序,它应该处理(VAD,Loudness,Clipping)很多声音文件(例如100k)。这时,我创建尽可能多的工作线程(callables),然后将其放入内存中,然后使用threadPool.invokeAll()运行所有线程,将结果写入文件系统,卸载已处理的文件并继续执行步骤1。由于事实上它是一个带有GUI的应用程序,我不希望用户在处理所有声音文件时觉得应用程序“没有响应”。 (此时它会导致invokeAll阻塞)。我不确定解决这个问题的“好方法”是什么。用户在处理时不可能做其他事情,但我想显示一个进度条,如“10个100000声音文件已完成”。那我怎么去那里?我是否必须创建一个“观察者线程”,以便每个工作者都对其进行回调?我对多线程很陌生,并且不了解这种机制。

如果你需要知道:我正在使用SWT / JFace。

2 个答案:

答案 0 :(得分:3)

您可以使用ExecutorCompletionService来达到此目的;如果您在循环中提交每个Callable任务,则可以调用完成服务的take方法 - 在完成时一次接收一个任务。每次执行任务时,都可以更新GUI。

作为另一种选择,您可以实现自己的ExecutorService,它也是Observable,允许在任务完成时发布订阅Observer的更新。

答案 1 :(得分:2)

你应该看看SwingWorker。这是一个很好的课程,可以进行冗长的操作,同时向gui报告进度并保持响应的gui。

Using a Swing Worker Thread提供了一些很好的信息。