代码之家  ›  专栏  ›  技术社区  ›  InsertNickHere

实现java FixedTreadPool状态监听器

  •  2
  • InsertNickHere  · 技术社区  · 16 年前

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

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

    2 回复  |  直到 14 年前
        1
  •  3
  •   Finbarr    16 年前

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

    作为另一种选择,您可以实现自己的 ExecutorService 这也是一个问题 Observable Observer 每当任务完成时。

        2
  •  2
  •   aioobe    16 年前

    SwingWorker . 它是一个很好的类,用于在向gui报告进度和维护响应性gui的同时执行长时间的操作。

    Using a Swing Worker Thread 提供了一些有用的信息。