Рабочие потоки Swing не параллельны

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

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

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

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

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

3 ответа

Решение

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

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

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

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

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

Класс 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);
Другие вопросы по тегам