java – ExecutorService和SwingWorker
作者:互联网
我已经看了一遍这个答案,但似乎无法找到它,所以如果这是一个愚蠢的问题,请道歉.请温柔.
我正在编写一个简单的MVC框架,我对SwingWorker以及它如何与ExecutorService一起工作感到困惑.
我想通过使用Executors.newFixedThreadPool(n)限制ExecutorService允许我的线程数.
我理解使用SwingWorker的重要性,因为它有执行冗长任务的方法(doInBackground …等),并允许通过事件调度线程更改GUI.
但是,创建Executors.newFixedThreadPool(n)会将线程数限制为n,而SwingWorker似乎限制为由某种私有内部常量MAX_WORKER_THREADS设置的10个线程.
我想知道的是我咆哮错误的树试图结合这两个类来限制线程数,因为暗示似乎是如果我向执行者提交SwingWorker任务,那一个任务会产生多达十个线程?
我最终的目标是编写一个程序,这将有一些密集的计算,我不想从一开始就犯这样的根本错误,因为这可能被证明是一个资源消耗问题,也就是说,我会有一个可爱的响应通过正确使用EDT进行GUI,但如果每个任务产生多达10个自己的线程,它将变得无法响应!
解决方法:
SwingWorker如何与ExecutorService一起使用?
> Swing维护一个使用的内部ExecutorService实例
执行通过SwingWorker机制提交的任务.
>我相信ExecutorService的实例化是隐藏的,因为它是SwingWorker实现的一部分,您可能无法编辑它.
>但与此同时,由于SwingWorker实现了Runnable,您可以将其提交给您自己的ExecutorService实例.
>如果调用execute()方法,那么它将被安排到它自己的ExecutorService.相反,您可以手动将SwingWorker实例提交到您自己的ExecutorService.
如果我向执行者提交SwingWorker任务,那么一个任务会产生多达十个线程吗?
>不.要理解这一点,您应该通过ExecutorService
文档.一项任务只使用一个线程(除非你
专门编写多线程任务).
>其他线程由ExecutorService保持空闲状态.这几乎不占用CPU时间.
>如果同时发生10个GUI事件,则每个事件将分配给每个可用线程.如果不需要该线程,它将不会运行.
>如果任务数超过可用线程数,则ExecutorService本身将在队列中调度它们.
希望这清除了疑虑.通常使用默认实现是一个好主意(它运行得很好),但如果需要,您可以轻松地限制线程数.此外,它不会取代Swing的ExecutorService.因为它已经存在,所以最好使用它而不是创建另一个.
祝好运.
标签:swingworker,java,model-view-controller,swing,executors 来源: https://codeday.me/bug/20190831/1772369.html