ExecutorService和SwingWorker

sws*_*aun 3 java model-view-controller swing swingworker executors

我已经看了一遍这个答案,但似乎无法找到它,所以如果这是一个愚蠢的问题,请道歉.请温柔.

我正在编写一个简单的MVC框架,我对此感到困惑SwingWorker以及如何使用它ExecutorService.

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

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

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

我想知道的是我咆哮错误的树试图结合这两个类来限制线程的数量,因为暗示似乎是如果我向一个SwingWorker任务提交一个任务Executor,那么一个任务会产生多达十个线程吗?

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

Tan*_*til 5

如何SwingWorker使用ExecutorService

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

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

  • 不.要了解这一点,您应该阅读ExecutorService 文档.一个任务只使用一个线程(除非您专门编写多线程任务).
  • 其他线程保持空闲状态ExecutorService.这几乎不占用CPU时间.
  • 如果同时发生10个GUI事件,则每个事件将分配给每个可用线程.如果不需要该线程,它将不会运行.
  • 如果任务数量超过可用线程数,则它们将由队列ExecutorService自己调度.

希望这清除了疑虑.通常使用默认实现是一个好主意(它运行得很好),但如果需要,您可以轻松地限制线程数.此外,它不会取代Swing的ExecutorService.因为它已经存在,所以最好使用它而不是创建另一个.

祝好运.

  • 你有两个选择 1. 这个论坛喜欢 SwingWorker, 2. 但我的看法不同,只是为了个人享受,而不是生产代码,因为你没有任何(真正的)控制权(不包括取消())关于代码流,是否有从 Executor 调用的普通 SwingWorker 或 SwingWorker 无关紧要,同样,Executor、Future 和 SwingWorker 是(前十名之一)Java 中的三大浪费者 (2认同)