簡體   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