ExecutorService and SwingWorker



我已经找遍了这个答案,但似乎找不到,所以如果这是一个愚蠢的问题,我很抱歉。请温柔一点。

我正在写一个简单的MVC框架,对SwingWorker以及它如何与ExecutorService协同工作感到困惑。

我想通过使用Executors.newFixedThreadPool(n)来限制ExecutorService允许我使用的线程数。

我理解使用SwingWorker的重要性,因为它有执行长任务(doInBackground…等)的方法,并允许通过事件调度线程更改GUI。

然而,创建Executors.newFixedThreadPool(n)将线程数限制为n,而SwingWorker似乎具有由某种私有内部常量MAX_WORKER_THREADS设置的10个线程的限制。

我想知道的是,我试图将这两个类组合起来以限制线程数量,这似乎意味着,如果我向Executor提交一个SwingWorker任务,那么一个任务会产生多达十个线程吗?

我的最终目标是编写一个需要大量计算的程序,我不想从一开始就犯这样的根本错误,因为这可能会被证明是一个资源消耗问题,也就是说,通过正确使用EDT,我将拥有一个可爱的响应GUI,但如果每个任务都产生多达10个自己的线程,它就会变得没有响应!

SwingWorker如何与ExecutorService协同工作

  • Swing维护一个内部ExecutorService实例执行您通过SwingWorker机制提交的任务
  • 我认为ExecutorService的实例化是隐藏的,因为它是SwingWorker实现的一部分,您可能不会编辑它
  • 但同时,由于SwingWorker实现了Runnable,您可以将其提交给自己的ExecutorService实例
  • 如果您调用execute()方法,那么它将被调度到它自己的ExecutorService。相反,您可以手动将SwingWorker实例提交给自己的ExecutorService

如果我向Executor提交一个SwingWorker任务,那么一个任务会产生多达十个线程吗

  • 没有。要理解这一点,您应该通过ExecutorService文档一个任务将只使用一个线程(除非特别是编程多线程任务)
  • 其他线程由CCD_ 26保持空闲。这几乎不消耗CPU时间
  • 如果同时发生10个GUI事件,每个事件将被分配给每个可用线程。如果不需要该线程,它将不会运行
  • 如果任务数量大于可用线程数量,则ExecutorService本身将在队列中对它们进行调度

希望这能消除疑虑。通常,使用默认实现是一个好主意(它工作得很好),但如果需要,可以很容易地限制线程数量。此外,它不会取代Swing的ExecutorService。既然它已经存在,最好使用它,而不是创建另一个。

祝你好运。

最新更新