4

我有一个使用 2 个长时间运行的 SwingWorker 任务的应用程序,我刚刚遇到了几台 Windows 计算机,它们的 JVM 更新后只启动其中一个。没有指示错误,因此我必须假设默认线程池只有一个线程,因此当我尝试执行第二个 SwingWorker 对象时它正在排队。

那么,(1)如何检查默认 SwingWorker 线程池中有多少线程可用,以及(2)如果需要更多线程,如何添加线程?

还有什么我应该知道的吗?这种明显的单线程线程池情况违背了我的所有期望。

我正在设置一个 ThreadPoolExecutor 但这似乎很错误......

4

3 回答 3

2

也许有点晚了,但在较新的 Java 版本中存在一个错误: SwingWorker deadlocks due to one thread in the swingworker-pool

于 2010-06-24T05:42:24.653 回答
1

默认 SwingWorker 线程池实际上有 10 个线程(在私有变量 SwingWorker.MAX_WORKER_THREADS 中定义)。如果您只看到一个任务开始,我会使用 JConsole 或其他类似工具检查另一个线程的状态。

没有简单的方法来弄乱默认的 SwingWorker 线程池(它是私有的,不被任何公共方法公开)。如果默认池不起作用,则将 SwingWorkers 添加到您自己的线程池是处理它的预期方法。

于 2010-05-03T17:47:23.497 回答
0

在 JDK 6 下,工作线程的默认数量是 10。

通常不需要创建 ThreadPoolExecutor,swing worker 使用的默认线程池通常就足够了。创建 ThreadPoolExecutor 可能很危险,因为一些静态方法只创建一个具有单个线程的池。

您可能希望将日志记录添加到这些线程(如果尚未存在)并检查日志。可能是其他一些同步问题正在停止您的第二个后台任务。

于 2010-05-03T17:58:48.227 回答