2011-12-20 3 views
1

Я работаю над проектом, в котором один поток прошивает еще 4 потока и ждет их завершения. Поток нитей должен иметь возможность останавливать разветвленные нитки в любое время. Чтобы, сделать то же самое, я сделал что-то, как например:Запуск новых потоков из темы

class ForkedThread implements Runnable { 
    public boolean keepRunning = true; 
    public void run() { 
     while(keepRunning is true){ 
     //Do the Job 
     } 
    } 
} 

Теперь, так как keepRunnig является публичным, он может получить доступ из вне и может быть сделано неверно. Мой вопрос: я должен синхронизировать использование keepRunning или его штраф. Во-вторых, эта техника в порядке. Или я должен использовать ThreadPool для выполнения своей работы. Собственно, использование ThreadPool увеличит сложность моего кода, чего я не хотел. Пожалуйста помоги.

ответ

2

Просто объявите keepRunning летучим, т.е.

public volatile boolean keepRunning = true; 

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

Техника, которую вы используете, является хорошей практикой. Это позволяет грациозно прекратить работу рассматриваемых потоков. Я бы порекомендовал вам взглянуть на новые библиотеки параллелизма (т. Е. ExecutorService) Java, поскольку они делают такие вещи, как вы делаете проще и безопаснее. Хорошо стоит инвестиций!

+1

Это очень проблема с булевыми! В противном случае JVM может свободно читать 'keepRunning' один раз, видеть, что это правда, хранить его в локальном кеше (например, на процессоре) и продолжать читать его там. Если другой поток изменяет его, JVM не обязан обновлять свой кеш; вы могли бы вращаться навсегда. «Неустойчивый» предотвращает это. Это не просто академическое; Я могу сделать это довольно легко на моем двухъядерном ноутбуке. – yshavit

+0

+1 yshavit ... спасибо, и поэтому мы все учимся ... –

0

Вы должны посмотреть ExecutorService. Он будет делать именно это.