Рабочие потоки 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);