java - java中如何知道线程池的任务何时结束

标签 java multithreading threadpool future nonblocking

我正在制作一个新闻更新应用程序。为此,它需要能够获取给定时间段的更新。在此我创建了一个计时器来在给定的时间段运行可调用插件。这里我使用了FixedThreadPool(执行器)。 为此,我想要知道 future 何时完成其工作,以便我可以调用 updateHeadlines 方法。但是当我使用 finish.get() 时,它会阻止 gui。有没有一种方法可以在不阻塞的情况下知道作业何时完成,然后我可以更新 GUI。

for (Callable curplugin : plugin) {
            new Timer(((NewsPlugin) curplugin).getUpdateFrequency(), new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    Future<?> finished = executor.submit(curplugin);

                    java.awt.EventQueue.invokeLater(new Runnable() {
                        public void run() {   
                            try {
                                ArrayList<Headline> news = (ArrayList) finished.get();
                                updateHeadlines();
                            } catch (InterruptedException ex) {
                                Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
                            } catch (ExecutionException ex) {
                                Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                    });
                }
            }).start();
        }

最佳答案

应该不需要结合TimerExecutorService,或者使用回调。相反,安排一个调用插件的 Runnable ,并安排一个 invokeLater 来显示结果:

for (NewsPlugin plugin : plugins) {
  Runnable task = () -> {
    List<Headline> news;
    try {
      news = plugin.call(); /* There's really no need for plugin to be `Callable` */
    } catch (Exception ex) {
      ex.printStackTrace();
    }
    java.awt.EventQueue.invokeLater(this::updateHeadlines);
  };
  int period = plugin.getUpdateFrequency();
  executor.scheduleAtFixedRate(task, period, period, TimeUnit.MILLISECONDS);
}

关于java - java中如何知道线程池的任务何时结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46940394/

相关文章:

java - 您自己的 OpenID Connect 提供商(开源)

c++ - 线程池 : Block destruction until all work is done

Java 线程在 Linux 中进入 hibernate 状态

java - scala 中的错误 : ambiguous reference to overloaded definition, ND4J

java - 在 AbstractInstallerScreen 中创建 Jersey 客户端的依赖性问题

java - 模拟 okhttp 响应

java - 暂停线程的好方法是什么?

c - 对 `fprintf(stdout, ...)` 和 `fprintf(stderr, ...)` 的调用是否保证不会与多个线程交错?

c# - 针对数据库队列管理线程池的最佳方法

c# 多线程应用程序中的 TCP 耗尽