我已经找遍了这个答案,但似乎找不到,所以如果这是一个愚蠢的问题,我很抱歉。请温柔一点。
我正在写一个简单的MVC框架,对SwingWorker
以及它如何与ExecutorService
协同工作感到困惑。
我想通过使用Executors.newFixedThreadPool(n)
来限制ExecutorService允许我使用的线程数。
我理解使用SwingWorker的重要性,因为它有执行长任务(doInBackground
…等)的方法,并允许通过事件调度线程更改GUI。
然而,创建Executors.newFixedThreadPool(n)
将线程数限制为n
,而SwingWorker
似乎具有由某种私有内部常量MAX_WORKER_THREADS
设置的10个线程的限制。
我想知道的是,我试图将这两个类组合起来以限制线程数量,这似乎意味着,如果我向Executor
提交一个SwingWorker
任务,那么一个任务会产生多达十个线程吗?
我的最终目标是编写一个需要大量计算的程序,我不想从一开始就犯这样的根本错误,因为这可能会被证明是一个资源消耗问题,也就是说,通过正确使用EDT,我将拥有一个可爱的响应GUI,但如果每个任务都产生多达10个自己的线程,它就会变得没有响应!
SwingWorker
如何与ExecutorService
协同工作
- Swing维护一个内部
ExecutorService
实例执行您通过SwingWorker
机制提交的任务 - 我认为
ExecutorService
的实例化是隐藏的,因为它是SwingWorker
实现的一部分,您可能不会编辑它 - 但同时,由于
SwingWorker
实现了Runnable
,您可以将其提交给自己的ExecutorService
实例 - 如果您调用
execute()
方法,那么它将被调度到它自己的ExecutorService
。相反,您可以手动将SwingWorker
实例提交给自己的ExecutorService
如果我向Executor提交一个SwingWorker
任务,那么一个任务会产生多达十个线程吗
- 没有。要理解这一点,您应该通过
ExecutorService
文档一个任务将只使用一个线程(除非特别是编程多线程任务) - 其他线程由CCD_ 26保持空闲。这几乎不消耗CPU时间
- 如果同时发生10个GUI事件,每个事件将被分配给每个可用线程。如果不需要该线程,它将不会运行
- 如果任务数量大于可用线程数量,则
ExecutorService
本身将在队列中对它们进行调度
希望这能消除疑虑。通常,使用默认实现是一个好主意(它工作得很好),但如果需要,可以很容易地限制线程数量。此外,它不会取代Swing的ExecutorService
。既然它已经存在,最好使用它,而不是创建另一个。
祝你好运。