Java Swingworker и несколько потоков - PullRequest
7 голосов
/ 10 февраля 2012

Я нахожусь в процессе разработки Java-управляемого приложения, которое выполняет несколько отдельных задач, каждая в своем собственном расширенном классе SwingWorker. Это нормальный дизайн, который я использую, чтобы запускать задачи в своих потоках, и при этом EDT свободен для обновления графического интерфейса. Каждый SwingWorker запускается в своем собственном потоке с использованием Executors.newCachedThreadPool.

Однако в одном конкретном классе есть задача, которая требует довольно длительного времени для обработки. Задача содержит цикл for, который выполняет некоторые вычисления до шести раз.

Я думал о реализации каждого из шести вычислений в своем собственном потоке, чтобы ускорить время обработки, но я не уверен в наилучшем способе реализации этого.

Можно ли расширить SwingWorker и реализовать Runnable, а затем использовать метод void Run () в цикле for, каждый раз начиная новый поток или используя cachedThreadPool.

Или мне лучше просто использовать стандартную реализацию Thread ()?

Любые советы или предложения будут оценены.

Заранее спасибо

Josh

1 Ответ

5 голосов
/ 10 февраля 2012

user988052, конечно, прав - если у вас нет многоядерного ЦП, выполнение вычислений в шести разных потоках фактически замедлит работу вашего приложения из-за накладных расходов, связанных с созданием и администрированием потоков.

Если вы хотите выполнить эти вычисления в шести отдельных потоках, тем не менее, вы можете использовать SwingWorker в качестве управляющего потока и создать 5-6 новых потоков в нем.Тогда можно использовать ExecutorService, поскольку он использует пул потоков и, таким образом, сводит к минимуму накладные расходы, связанные с созданием и удалением потока.

Редактировать: ответить на ваш комментарий:

Я думаю, что лучшим способом было бы реализовать вычисления в Runnable (чтобы каждый из шести расчетов мог выполняться отдельно), затем просто использовать ExecutorService, создать экземпляр Runnable шесть раз и использоватьExecutorService.submit(Runnable task).Вы можете сделать все это в методе SwingWorker.doInBackground().

Вы никогда не должны вызывать метод run() самостоятельно - пусть это будет сделано Thread / ExecutorService.

...