Java 执行器服务和SwingWorker

Java 执行器服务和SwingWorker,java,swing,model-view-controller,swingworker,executors,Java,Swing,Model View Controller,Swingworker,Executors,我已经到处寻找这个答案,但似乎找不到,所以如果这是一个愚蠢的问题,我道歉。请温柔一点 我正在编写一个简单的MVC框架,对SwingWorker及其如何与ExecutorService协同工作感到困惑 我想通过使用Executors.newFixedThreadPool(n)来限制ExecutorService允许的线程数 我理解使用SwingWorker的重要性,因为它有执行冗长任务的方法(doInBackground…等),并允许通过事件调度线程更改GUI 但是,创建Executors.new

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

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

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

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

但是,创建
Executors.newFixedThreadPool(n)
将线程数限制为
n
,而
SwingWorker
似乎由某种私有内部常量
MAX\u WORKER\u threads
设置了10个线程的限制

我想知道的是,我试图将这两个类结合起来以限制线程的数量,这是错误的,因为这意味着如果我将一个
SwingWorker
任务提交给一个
执行者
,那么一个任务最多会产生十个线程吗

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

SwingWorker
如何使用
ExecutorService
  • Swing维护一个内部
    ExecutorService
    实例,该实例被使用 执行通过
    SwingWorker
    机制提交的任务
  • 我相信
    ExecutorService
    的实例化是隐藏的,因为它是
    SwingWorker
    实现的一部分,您可能无法编辑它
  • 但同时,由于
    SwingWorker
    实现了
    Runnable
    ,因此您可以将其提交给自己的
    ExecutorService
    实例
  • 如果调用
    execute()
    方法,则它将被调度到自己的
    executerservice
    。相反,您可以手动将
    SwingWorker
    实例提交到您自己的
    ExecutorService
如果我向执行者提交一个
SwingWorker
任务,那么一个任务最多会产生十个线程吗?
  • 不可以。要理解这一点,您应该通过
    ExecutorService
    文档一个任务将只使用一个线程(除非 特别是编程多线程任务)
  • 其他线程由执行器服务保持空闲状态。这几乎不消耗CPU时间
  • 如果10个GUI事件同时发生,则每个事件将分配给每个可用线程。如果线程不是必需的,它将不会运行
  • 如果任务数大于可用线程数,则
    ExecutorService
    本身将在队列中调度任务
希望这能消除疑虑。通常,使用默认实现是一个好主意(它工作得非常好),但如果需要,可以轻松地限制线程数。此外,它不会取代Swing的
ExecutorService
。因为它已经存在,所以最好使用它,而不是创建另一个


祝你好运。

Executor&SwingWorker有一个bug,偶尔会有Java版本(1.6_015,1.6_022)的缺陷,但只有在加载最大线程(12)时才可能发现这个问题,然后SwingWorker not ended(在done()中),默认情况下不限制线程数,因为不能保证在预期的时间内全部结束,所以我对执行者的看法不知道(也不关心)关于SwingWorker是否被执行或结束,三个黑洞一起使用执行者、未来和SwingWorker对不起,我没有理解你的意思。您是建议一般避免使用Swingworker还是建议使用定制服务的Swingworker?SwingWorker文档的最后一行是“因为SwingWorker实现了Runnable,所以SwingWorker可以提交给执行者执行。”。这个论坛喜欢SwingWorker,2。但我的观点不同,只是为了个人享受,而不是生产代码,因为您对代码流没有任何(真正的)控制(不包括cancel()),不管是否存在从Executor调用的普通SwingWorker或SwingWorker,同样是Executor、Future和SwingWorker(前十名之一)Java中三大浪费确保您的答案不受影响将
SwingWorker
发布到
ExecutorService
是一个好主意。