2012-07-04 4 views
0

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

public class testestes { 
    static volatile boolean key; 

    public static void main (String []args) 
    { 
     key=true; 
     Thread thread=new Thread(new Runnable() 
     { 
      public void run() 
      { 
       while(key) 
       { 
        System.out.println("running"); 
       } 
      } 
     }); 

     thread.start(); 
     key=false; 
    } 
} 
+0

Я пробовал ваш код, и он останавливается. –

+0

Я тоже не понимаю, как только вызов 'run()' был изменен на 'start()', запускается новый поток, а когда ключ установлен в false, новый поток ** останавливается **. Этот код отлично работает для меня. Проблема должна быть в коде, который не был отправлен здесь. –

ответ

2

Я не использовать boolean, чтобы проверить, следует ли нить прекратить. Если вы используете volatile в качестве модификатора поля, это будет работать надежно, но если ваш код станет более сложным, вместо использования других методов блокировки внутри цикла while может случиться так, что ваш код будет не заканчиваться вообще или по крайней мере занимает больше времени как вам захочется.

Некоторые методы библиотечной блокировки поддерживают прерывание.

Каждый поток имеет уже логический флаг прерванный статус и вы должны использовать его. Она может быть реализована следующим образом:

public void run() { 

    try { 
     while(!Thread.currentThread().isInterrupted()) { 
     // ... 
     } 
    } catch (InterruptedException consumed) 
     /* Allow thread to exit */ 
    } 

} 

public void cancel() { interrupt(); } 

Исходный код взят из Java Concurrency in Practice. Поскольку метод cancel() является общедоступным, вы можете позволить другому потоку вызывать этот метод по своему усмотрению.

Существует также слабоименованный статический метод interrupted, который очищает прерванный статус текущего потока.

+1

Я решил использовать это решение, хотя это не ответ на мой первоначальный вопрос, это фактический ответ на мою проблему, и это, кажется, лучший вариант. (Клянусь, что на моем ПК фрагмент кода не останавливался, я до сих пор не знаю почему). – crusader

1

Вы хотите назвать thread.start();, НЕ thread.run();. run() не будет fork.

Кроме того, это, вероятно, будет так, что вы не увидите «работает» выход, потому что вы сразу же установив key ложь после вилки так, когда раздвоенный поток входит run(), key уже неверно.

+0

моя проблема в том, что я не могу остановить вывод из появившегося файла, я хочу остановить поток, чтобы он не запускался. – crusader

+0

@crusader Когда вы вызываете 'thread.start()' вместо 'thread.run()', вы не можете остановить вывод из вывода? –

+0

Вы можете вызвать System.exit, если хотите остановить все это (JVM), но я не уверен, что это решение, которое вы хотите. – Joset

0

Основной макет для этого состоит в том, чтобы на самом деле иметь класс, который реализует Runnable.

public class SampleThread implements Runnable 
{ 
    private volatile boolean stopFlag = false; 

    public void stopThisThread() 
    { 
    stopFlag = true; 
    } 

    public void run() 
    { 
    while (!stopFlag) 
    { 
     //doStuff 
    } 
    } 
} 

Тогда в другом месте

SampleThread sample = new SampleThread(); 
new Thread(sample).start(); 
//Then when you want to kill it... 
sample.stopThisThread(); 
0

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

0

Я считаю, что вы можете рассмотреть прерывание потока с помощью Thread.interrupt(). В учебниках Java есть хорошая статья об этом.

Ответы, предлагающие флаг boolean, одинаково верны. В любом случае вы будете где-то проверять какое-то условное утверждение, чтобы проверить, должен ли ваш поток завершиться. Условием завершения может быть либо то, что поток был прерван, либо установлен его булевский флаг (в зависимости от выбранной вами реализации).

Последнее предупреждение: никогда не используйте Thread.stop(). Он устарел по уважительной причине. См. here за хорошее объяснение.

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