最大可运行的 Swing 工作线程数量是多少?

10

Swing Worker线程的数量是否有上限,还是只要内存支持就可以无限增加?另外,这个配置能否在某处进行调整?


我认为SwingWorkers令人困惑的一点是,SwingWorker.execute()方法在默认/私有线程池上运行工作线程,该线程池固定为一些较低数量的线程。这对于小型/简单应用程序可能足够合理。但是,如果需要更多控制并发,请做出两个观察:1. SwingWorkers是RunnableFutures 2. SwingWorkers不必通过调用SwingWorker.execute()方法来运行。因此,只需创建自己的线程池(ExecutorService)并根据需要进行配置,然后在其中提交(submit())或执行(execute())SwingWorkers即可。 - Greg Mattes
2个回答

14

SwingWorker不是线程本身,而是将在线程中执行的任务。通常,您会使用ExecutorService来执行SwingWorker的实例;该接口还允许设置线程数:

 int n = 20; // Maximum number of threads
 ExecutorService threadPool = Executors.newFixedThreadPool(n);
 SwingWorker w; //don't forget to initialize
 threadPool.submit(w);

现在,如果您提交了超过n个SwingWorker实例,它们将必须排队等待,直到线程池中的线程可用。

那么你的意思是理论上我可以运行任意数量的Swing Worker任务,只要为每个任务运行单独的线程。 - Sreenath Prem
原则上是的;当然,计算能力将是一个问题。 - mort
3
为什么要这样做?SwingWorker有自己的线程池,默认大小为10,当您调用SwingWorker#execute()方法时,它会安排任务。此方法将SwingWorker计划在工作线程上执行。有很多可用的工作线程。如果您自己实现线程池,这相当于重复造轮子。SwingWorker是一个实用程序,以避免重复制造轮子。唯一需要这样做的原因是默认池大小10太小,此时您应该使用原始的Runnable - searchengine27

3
final int corePoolSize = 100;
final int maximumPoolSize = 100;
final long keepAliveTime = 100000;
final TimeUnit unit = TimeUnit.SECONDS;
final BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(maximumPoolSize);
sun.awt.AppContext.getAppContext().put(SwingWorker.class,
                 new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue));

上述代码示例将允许您执行超过默认数量的SwingWorkers。当然,它正在访问一些后门sun.awt.AppContext类,但对于那些有兴趣且无法/不愿提供自己的ExecutorService的人来说,这是一个快速解决方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接