Как закончить поток в Java? - PullRequest
1 голос
/ 01 июня 2010

у меня 2 пула потоков

ioThreads = (ThreadPoolExecutor)Executors.newCachedThreadPool();

cpuThreads = (ThreadPoolExecutor)Executors.newFixedThreadPool(numCpus);

У меня есть простой веб-сканер, который я хочу создать iothread, передать ему URL-адрес, затем он извлечет URL-адрес и передаст содержимое в cpuThread для обработки, а ioThread получит другой URL-адрес и т. Д. ..

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

Ответы [ 3 ]

2 голосов
/ 01 июня 2010

Вы можете дождаться завершения всех потоков, используя CyclicBarrier, например http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CyclicBarrier.html

2 голосов
/ 01 июня 2010

Типичным способом было бы использовать общий (энергозависимый или синхронизированный) логический флаг (ы) для связи между потоками. Когда поток ввода-вывода закончен, он переворачивает флаг. Другой поток проверяет значение флага в цикле, и когда он видит измененное значение, он выходит из цикла и завершается.

Если вы используете модель «производитель-потребитель» с рабочей очередью между потоками ввода-вывода и потоками обработки, другой возможностью будет передача в очередь специального маркера «окончания обработки», который будет сигнализировать процессорам может прекратить.

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

Выложите логику программы. Хранить URL-адреса в объекте Stack (стеки являются потокобезопасными)

если

a. there are no more URLs on the stack
b. no more crawler threads running
c. no more CPU/processing threads running

Затем программа может записать в БД и выйти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...