Как повторно использовать поток в Java? - PullRequest
13 голосов
/ 06 июня 2010

Я строю консоль Судоку Солвер, где основной целью является грубая скорость.

Теперь у меня есть ManagerThread, который запускает WorkerThreads для вычисления соседних элементов каждой ячейки. Таким образом, один WorkerThread запускается для каждой ячейки прямо сейчас. Как я могу повторно использовать существующий поток, который завершил свою работу?

Шаблон пула потоков, по-видимому, является решением, но я не понимаю, что делать, чтобы предотвратить умирание потока после завершения его работы.

ps: я не ожидаю увеличения производительности для этой конкретной задачи, просто хочу поэкспериментировать, как работает многопоточность, прежде чем применять ее к более сложным частям кода.

Спасибо

Ответы [ 4 ]

14 голосов
/ 06 июня 2010

Взгляните на предоставляемый Java SE java.util.concurrent API. Вы можете создать пул потоков, используя Executors#newFixedThreadPool(), и можете отправлять задачи, используя методы ExecutorService. Не нужно заново изобретать свой собственный пул потоков. Также см. Учебник по теме Sun .

3 голосов
/ 06 июня 2010

при использовании пула потоков (java.util.concurrent) вы фактически никогда не инициализировали поток, а скорее передали Runnables в пул потоков. вам не нужно беспокоиться о жизненном цикле потока, просто делайте все, что вам нужно, в runnable и дайте ему завершиться, когда он будет завершен.

1 голос
/ 07 июня 2010

Ознакомьтесь с использованием CyclicBarrier synchro: http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CyclicBarrier.html

0 голосов
/ 07 июня 2010

Ну, если бы мне пришлось самому кодировать эту логику вместо использования пакета, подобного Quartz из OpenSymphony, я бы сделал следующее: Я бы имел WorkerThread, который расширяет поток. Этот класс также будет иметь частное свойство runnable, которое называется Runnable. Это свойство будет содержать ссылку на код, который вы хотите выполнить. Есть публичный сеттер для этого. Код основного потока начнется с запуска исполняемого файла, с которым вы его инициализировали, а затем переключится в состояние ожидания. Перед этим он сообщит менеджеру пула, что он закончил, и может быть возвращен в пул. В следующий раз, когда вам нужен поток, вы выбираете один из пула, вызываете setRunnable, который устанавливает свойство runnable, а затем пробуждает поток. Он вернется к работе, войдет в бесконечный цикл: выполнить и запустить и вернуться в состояние ожидания.

...