3

我已经到处寻找这个答案,但似乎找不到它,如果这是一个愚蠢的问题,我深表歉意。请温柔一点。

我正在编写一个简单的 MVC 框架,并且SwingWorker对它如何与ExecutorService.

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

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

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

我想知道我是不是在尝试将这两个类组合起来以限制线程数时出现错误的树,因为这意味着如果我向SwingWorkeran 提交任务,Executor那么该任务会产生多达 10 个线程吗?

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

4

1 回答 1

5

如何SwingWorker使用ExecutorService

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

如果我向 Executor 提交SwingWorker任务,该任务会产生多达 10 个线程吗?

  • 不,要理解这一点,您应该阅读ExecutorService 文档。一项任务将只使用一个线程(除非您专门编写多线程任务)。
  • 其他线程保持空闲状态ExecutorService。这几乎不消耗 CPU 时间。
  • 如果同时发生 10 个 GUI 事件,则每个事件都将分配给每个可用线程。如果线程不是必需的,它将不会运行。
  • 如果任务数多于可用线程数,它们将自行安排在队列中ExecutorService

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

祝你好运。

于 2014-03-02T21:45:49.443 回答