2

我正在用Java Swing創建一個MVP應用程序。我需要執行各種這是Task類的實例,我創建了延伸SwingWorker類!定製的ThreadPoolExecutor同時執行一些任務,並在隊列中的一些

我遇到了Executors班,但沒有一個提供的執行者似乎滿足我的需求。

我想同時執行一些我的Task實例和我的一些Task實例在隊列中。另外,我想在所有任務完成時調用方法。喜歡,done方法SwingWorker類!

abstract class CustomExecutor extends ThreadPoolExecutor { 

    CustomExecutor(Collection<Task> synchronousTasks, Collection<Task> asynchronousTasks) { 
     // ......... 
    } 

    // To be called when all tasks have been executed successfully! 
    abstract void done(); 

} 

我沒有用ExecutorServiceThreadPoolExecutor之前,無法拿出任何解決方案!

+0

你是什麼意思「我想執行一些我的任務實例同步(併發)和我的一些任務實例異步(在隊列中)。」? 「同步」與「併發」非常不同,「異步」與排隊無關。你能否詳細說明/提供一個例子? –

+0

赦免造成混亂!我編輯了這個問題!我需要一些任務「同時」和「一些」在隊列中(一個接一個地執行)! – Akshat

回答

0

我們來簡單比較一下你提到的兩種解決方案 - SwingWorkerExecutors框架。這兩種解決方案背後的總體思路是相似的,但根據用例,一個可以比另一個更好。

的SwingWorker

  • 異步執行在doInBackground方法實現的邏輯。
  • 你繼承SwingWorker實現邏輯
  • 有一些有用的方法來與Swing集成並更新Event Dispatch Thread的UI - publish()process()done()get/setProgress()和一些屬性更改偵聽器支持的方法。
  • SwingWorker單個實例對應於單個任務
  • 當調用SwingWorker.execute(),內部的工人實例提交本身作爲任務(Callable)到ExecutorService(準確地 - 一個ThreadPoolExecutor),使得邏輯在doInBackground方法中執行的方法在單獨的線程中異步執行
  • 存在您曾創建的所有SwingWorker對象使用的默認配置ThreadPoolExecutor,隱藏在SwingWorker類中。如果您想提供自己的ExecutorService以執行SwingWorker,您可以通過設置sun.awt.AppContext.getAppContext().put(SwingWorker.class, yourOwnExecutorService)來實現。但是,正如我所說的,您的應用程序中的所有SwingWorker只能有一個全局的ExecutorService
  • 總結:SwingWorker隱藏您的併發細節,但暴露API與Swing UI進行通信。如果您的任務首先需要在後臺執行一些計算並更新UI,請使用SwingWorker
  • 更多

執行人框架

  • 你是在ExecutorService配置的完全控制 - 有實用方法在Executors類來創建一些常用的配置,或者您也可以實例化ThreadPoolExecutor你自己。
  • 該框架是通用的 - 它接受任何可執行任何邏輯的任務Runnable/Callable任務。 Swing沒有特別的支持。
  • 你自己需要shutdownExecutorService
  • 更多Executors Framework

如果我正確理解你的要求,你可能更願意使用ExecutorService而非SwingWorker,讓你有超過併發更多的控制。將您想要排隊的任務(即按順序執行)提交給使用Executors#newSingleThreadExecutor()創建的執行程序。對於要同時執行的任務,請使用與Executors#newCachedThreadPool()Executors#newFixedThreadPool(int)或自定義ThreadPoolExecutor創建的不同ExecutorService。請參閱Javadocs以檢查最適合您的需求。

您可以使用ExecutorService#invokeAll()在一次提交多個任務,以阻止,直到他們這樣做,或者你可以撥打ExecutorService#submit()在一個循環接一個提交他們一個不阻塞,並在獲得後瞬間調用Future.get()Futuresubmit()阻塞,直到執行完成。

一旦調用get()所有期貨 - 這兩個對應synchronousTasksasynchronousTasks,你知道,所有的都做了,你可以叫你done()方法。

如果您想了解更多,我建議您閱讀Javadocs和源代碼SwingWorkerExecutorExecutorService類。

相關問題