Как снова использовать поток в Java?

Я - здание консоль Sudoku Solver, где основная цель является необработанной скоростью.

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

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

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

Спасибо

13
задан David 6 June 2010 в 17:10
поделиться

4 ответа

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

14
ответ дан 1 December 2019 в 23:30
поделиться

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

3
ответ дан 1 December 2019 в 23:30
поделиться

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

1
ответ дан 1 December 2019 в 23:30
поделиться

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

0
ответ дан 1 December 2019 в 23:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: