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类。

相关问题