我有一个使用2个长期运行的SwingWorker任务的应用程序,我刚刚遇到了几台带有更新JVM的Windows计算机,这些计算机只能启动其中一个。没有指出错误所以我必须假设默认线程池只有一个线程,因此当我尝试执行它时,第二个SwingWorker对象就会排队。
那么,(1)如何检查默认SwingWorker线程池中有多少线程可用,以及(2)如果我需要更多线程,我该如何添加线程?
还有什么我应该知道的吗?这种明显的单线程线程池情况违背了我的所有期望。
我正在设置一个ThreadPoolExecutor,但这似乎错了......
答案 0 :(得分:2)
可能有点迟了但是,新版Java中存在一个错误: SwingWorker deadlocks due one thread in the swingworker-pool
答案 1 :(得分:1)
默认的SwingWorker线程池实际上有10个线程(在私有变量SwingWorker.MAX_WORKER_THREADS中定义)。如果你只是看到你的一个任务开始,我会用JConsole或其他类似工具检查另一个线程的状态。
没有简单的方法来处理默认的SwingWorker线程池(它是私有的,不会被任何公共方法暴露)。如果默认池不起作用,则将SwingWorkers添加到您自己的线程池是处理它的预期方法。
答案 2 :(得分:0)
在JDK 6下,默认的工作线程数为10.
您通常不需要创建ThreadPoolExecutor,swing worker使用的默认线程池通常就足够了。创建一个ThreadPoolExecutor可能很糟糕,因为一些静态方法只创建一个带有单个线程的池。
您可能希望向这些线程添加日志记录(如果尚未存在),并检查日志。可能是某些其他同步问题正在停止您的第二个后台任务。