繁体   English   中英

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

[英]How to know when the tasks of threadpool is over in java

我正在制作新闻更新应用。 为此,它需要能够在给定的时间段内获得更新。 为此,我创建了一个计时器,以在给定的时间段内运行可调用插件。 在这里,我使用了FixedThreadPool(executor)。 为此,我想知道将来什么时候完成工作,所以我可以调用updateHeadlines方法。 但是当我使用finished.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(); } 

如果您使用的是Java 8,那么将来会有一个完整的未来,您可以在其中注册一个回调,当任务完成时将调用该回调。 我认为这将对您有所帮助。

可能会帮助您通过CompletableFuture进行回调

不需要合并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 8开始,您可以使用CompletableFuture来完成一次射击任务的回调。 在Java 8之前,您可以使用Guava的ListenableFuture ,它具有类似的功能。

对于循环任务,请使用可观察的模式,这是期货的对应模式,用于处理从重复任务返回的多个物料。 但是,Java似乎在这里没有提供好的OOTB解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM