【问题标题】:Implementing java FixedTreadPool status listener实现 java FixedTreadPool 状态监听器
【发布时间】:2010-05-14 06:31:01
【问题描述】:

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

如果您需要了解:我正在使用 SWT/JFace。

【问题讨论】:

    标签: java multithreading progress-bar


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      你应该看看SwingWorker。这是一个很好的类,可以进行冗长的操作,同时向 gui 报告进度并维护响应式 gui。

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

      【讨论】:

      • 这看起来很像我想要的,但恐怕我必须处理 swt/jface/java.concurrent - 编写了很多代码,我没有时间全部重做。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      相关资源
      最近更新 更多