![](/img/trans.png)
[英]RejectedExecutionException when executing tasks using threadpool : 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进行回调
不需要合并Timer
和ExecutorService
或使用回调。 而是安排一个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.