Swing Worker线程不是并发的

6

当我实例化12个Swing Worker线程时,似乎前6个开始完成它们的任务,然后完成,并且最后6个开始并完成。我要寻找的行为是所有12个线程同时开始工作并同时完成。

我有以下代码:

for (int i = 0; i < 12; i++ )
{
        myTask m = new Mytask(i, START);
        m.execute();
}

myTask m将以25的增量从0到100递增进度条。我遇到了奇怪的问题,前六个线程开始递增,它们完成100,然后最后六个线程从0开始递增,并完成。

是否存在限制Swing Worker线程数量的因素?

3个回答

7
我需要的行为是12个线程同时开始工作并同时完成。 CountDownLatch旨在实现这一目的。这里有一个很好的示例, 使用单个SwingWorker和由闩控制的多个子线程。

我今天的学习项目 :-) 只是不喜欢示例的一个方面:任务在EDT上访问textComponent(此时仍然有文档记录为线程安全...这总是有争议的...)简而言之:最好不要依赖它并在invokeLater中包装。 - kleopatra
@kleopatra:发现得好!这个例子有相似的(潜在)问题;它的display()方法说明了您的建议。 - trashgod

2

SwingWorker类有一个带有MAX_WORKER_THREADS = 10的静态ExecutorService字段。我不确定为什么您看到的是6而不是10。但是您不能超过10。

    /**
     * number of worker threads.
     */
    private static final int MAX_WORKER_THREADS = 10;

...

    executorService =
                new ThreadPoolExecutor(1, MAX_WORKER_THREADS,
                                       10L, TimeUnit.MINUTES,
                                       new LinkedBlockingQueue<Runnable>(),
                                       threadFactory);

我能手动更改MAX_WORKER_THREADS的数量吗?还是说这不可能?为什么要有一个任意的10个线程的数量? - user402642
不,你不能改变MAX_WORKER_THREADS的数量,因为它是一个final字段。至于原因,你需要问课程作者Igor Kushnirskiy。 - Thierry Roy
1
你可以使用自己的ExecutorService来执行SwingWorkers,因为它们是Futures。 - keuleJ

2
您的问题是:
行为我想要的是所有12个线程同时开始工作并同时完成。 但您无法保证所有Swing工作线程同时启动并在同一时间结束。

为什么不呢?背后的推理是什么? - user402642
因为它们是线程,而线程的执行取决于多个因素,如 CPU 数量、操作系统、可用资源等等。 - YoK
看看我的答案,可能会有另一种选择。 - trashgod

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