【问题标题】:ExecutorService and SwingWorkerExecutorService 和 SwingWorker
【发布时间】:2014-03-02 21:07:44
【问题描述】:

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

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

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

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

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

我想知道的是,我是在尝试将这两个类组合起来以限制线程数的错误树,因为这意味着如果我将SwingWorker 任务提交给Executor,会这样吗?一个任务最多产生十个线程?

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

【问题讨论】:

  • Executor 和 SwingWorker 存在一个错误,有时取决于 Java 版本(1.6_015、1.6_022),但只有当您超载最大线程数 (12) 时才能捕获此问题,然后SwingWorker 未结束(在 done() 中),默认是 non_sence 来限制线程数,因为没有任何保证在预期时间内全部在 done() 结束
  • 我对@9​​87654321@或here的看法

标签: java swing model-view-controller swingworker executors


【解决方案1】:

SwingWorker 如何与ExecutorService 协同工作?

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

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

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

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

祝你好运。

【讨论】:

  • Executor 不知道(也不关心)关于 SwingWorker 是否执行或结束的任何事情,三个黑洞一起使用 Executor、Future 和 SwingWorker
  • 对不起,我没有明白你的意思。您是建议一般应避免使用 SwingWorkers 还是应避免使用自定义 ExecutorService 的 SwingWorkers? SwingWorker 文档的最后一行是“因为 SwingWorker 实现了 Runnable,所以可以将 SwingWorker 提交给 Executor 执行。”
  • 你有两个选择 1. 这个论坛喜欢 SwingWorker, 2. 但我的看法不同,只是为了个人享受,绝不是为了生产代码,因为你没有任何(真实的)关于代码流的控制(不包括 cancel()),不管是否有从 Executor 调用的普通 SwingWorker 或 SwingWorker,Executor、Future 和 SwingWorker 是(前十名之一)Java 中的三大浪费者
  • 在这里确定你的答案没有任何问题
  • SwingWorker 发布到ExecutorService 是个好主意。
猜你喜欢
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 2014-09-10
  • 2011-01-29
相关资源
最近更新 更多