2014-02-17 11 views
0

Если 4 потока запущены и хотят, чтобы, если поток t1 завершает свою инструкцию и завершает работу, и хочет, чтобы t2 также прекращался после завершения t1, даже его команда не полностью завершена, тогда как t3 и t4 все еще работают, то есть он должен зависеть только от t2, ни от t3, ни от t4.Один поток зависит от другого

Кто-то предложил мне сделать демона t2, но это сделает t2 зависимым от t3, а также от t4.Any может помочь мне с примером, как это сделать?

+0

Уверен, это возможно. Прочитайте «[Урок: параллелизм] (http://docs.oracle.com/javase/tutorial/essential/concurrency/)». – Maroun

+0

Так что же еще должен делать 't1'? Что-нибудь? – EJP

+0

Неясный вопрос и множество возможных решений; например, общий 'AtomicBoolean' в цикле' while'. – fge

ответ

2

можно использовать с использованием CountDownLatch.

Это средство синхронизации, которое позволяет одному или более потоков ждать, пока набор операций не выполняется в других потоках completes.A CountDownLatch является универсальным synchronizati по инструменту и может быть использован для различных целей. A CountDownLatch , инициализированный подсчетом одного, служит как простая кнопка включения/выключения, либо gate: все потоки, вызывающие ожидание, ждут у ворот до тех пор, пока они не будут открыты. потоком, вызывающим countDown(). CountDownLatch, инициализированный до N , может использоваться, чтобы сделать один поток до тех пор, пока N потоков не завершит какое-либо действие, или какое-либо действие было выполнено N раз.

Фрагмент кода -

CountDownLatch doneSignal = new CountDownLatch(1); 
// Share the same object between two thread 
Thread T1{ 
public void run(){ 
    doneSignal.await(); //T1 will wait untill T2 finshed 
    ... 
} 
} 
... 
Thread T2{ 
public void run(){ 
    ... 
    doneSignal.countDown(); // sending signal that T2 is over 
} 
} 
1

Используйте Future и отменить его в случае необходимости.

1

слепое разрушение нитей опасная вещь

в Java лучшее, что вы можете сделать, это interrupt() t2, и пусть он пузыриться (с ручной проверки в случае необходимости), поэтому t2 может очистить после себя

например, в цикле, вы можете сделать:

if(Thread.interrupted())throw new InterruptedException(); 

регулярно в t2 (или обычая TimeoutException, если это ваш стиль, чтобы избежать проверил InterruptedException)

Смежные вопросы