这是一个应用程序,它应该处理(VAD,Loudness,Clipping)很多声音文件(例如100k)。这时,我创建尽可能多的工作线程(callables),然后将其放入内存中,然后使用threadPool.invokeAll()运行所有线程,将结果写入文件系统,卸载已处理的文件并继续执行步骤1。由于事实上它是一个带有GUI的应用程序,我不希望用户在处理所有声音文件时觉得应用程序“没有响应”。 (此时它会导致invokeAll阻塞)。我不确定解决这个问题的“好方法”是什么。用户在处理时不可能做其他事情,但我想显示一个进度条,如“10个100000声音文件已完成”。那我怎么去那里?我是否必须创建一个“观察者线程”,以便每个工作者都对其进行回调?我对多线程很陌生,并且不了解这种机制。
如果你需要知道:我正在使用SWT / JFace。
答案 0 :(得分:3)
您可以使用ExecutorCompletionService
来达到此目的;如果您在循环中提交每个Callable
任务,则可以调用完成服务的take
方法 - 在完成时一次接收一个任务。每次执行任务时,都可以更新GUI。
作为另一种选择,您可以实现自己的ExecutorService
,它也是Observable
,允许在任务完成时发布订阅Observer
的更新。
答案 1 :(得分:2)
你应该看看SwingWorker
。这是一个很好的课程,可以进行冗长的操作,同时向gui报告进度并保持响应的gui。
Using a Swing Worker Thread提供了一些很好的信息。