2014-02-02 1 views
0

Моя программа запускает поток, создаются ли какие-то объекты.Как прервать поток, даже если он еще не закончен?

Foo() { 
    t = new Thread(this); 
    t.start(); 
} 

И я выполняю цикл while внутри своих потоков.

while(bool){ 
    // do something 
} 

У меня есть один поток, управляющий значением булева bool. Но как я могу закончить некоторые из них, прежде чем мой другой поток изменит логическое значение? Я думаю, что установка t = null не работает. Есть ли способ мусора собирать поток, прежде чем он перестанет работать?

+1

[Реализовать свой собственный механизм прерывания.] (Http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html) –

+0

Случай Thread не имеет ничего общего с основным потоком выполнения. GCing это не волшебным образом приведет к тому, что поток перестанет выполняться, подобно тому как GCing экземпляр File не удалит файл. –

+0

Важно отметить, что 'bool' должен быть' volatile boolean', поэтому его можно изменять и читать несколькими потоками. – Gray

ответ

1

Изменение цикла для

while (bool && !Thread.interrupted()) { 
    // do something 
} 

Если вы хотите, чтобы остановить поток, вызовите

t.interrupt(); 

удачи.

+0

Или даже лучше, удалите bool, так как он используется для того же, что и флаг прерывания. –

+0

Он может использовать bool для управления им внутри цикла вместо перерыва. :) –

+0

Это всегда хорошая идея использовать 'Thread.currentThread(). IsInterrupted()' вместо этого, поэтому статус прерывания не очищается. – Gray