Java 执行器服务和SwingWorker
我已经到处寻找这个答案,但似乎找不到,所以如果这是一个愚蠢的问题,我道歉。请温柔一点 我正在编写一个简单的MVC框架,对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
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
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
是一个好主意。