Рабочие потоки Swing не параллельны - PullRequest
6 голосов
/ 27 августа 2010

Кажется, что когда я создаю экземпляр 12 потоков Swing Worker, первые шесть начинают выполнять свою задачу, она завершает И затем последние шесть запускаются и заканчиваются.Поведение, которое я ищу, состоит в том, что все 12 потоков начинают работать одновременно и заканчиваются одновременно.

У меня есть следующее:

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

MyTask m будет увеличивать aиндикатор выполнения от 0 до 100 с шагом 25. Я получаю странное поведение, когда первые шесть потоков начинают увеличиваться, они заканчиваются на 100, затем последние шесть потоков начинаются с 0, увеличиваются и заканчиваются.

Существует ли ограничивающий фактор для количества потоков Swing Worker, которые могут быть у вас?

Ответы [ 3 ]

7 голосов
/ 28 августа 2010

Требуемое поведение - все 12 потоков начинают работать одновременно и заканчиваются в одно и то же время.

A CountDownLatch - эторазработан для этой цели.Вот хороший пример с использованием одного SwingWorker и нескольких вспомогательных потоков, управляемых защелкой.

3 голосов
/ 27 августа 2010

Ваш вопрос говорит:

Я ищу поведение, когда все 12 потоков начинают работать одновременно и заканчиваются в одно и то же время.

Но вы не можете гарантировать, что все рабочие потоки Swing начинаются одновременно и заканчиваются одновременно.

2 голосов
/ 27 августа 2010

Класс SwingWorker имеет статическое поле ExecutorService с MAX_WORKER_THREADS = 10. Я не уверен, почему вы видите 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);
...