0

Я знаю, что вы можете прервать поток, созданный из say runnable class, но как я могу прервать этот поток, который я создал из метода? Использование volatile boolean для меня не работает, поэтому я предполагаю, что есть лучший способ сделать это, или мне нужно как-то прервать его. Я не хочу прерывать все потоки, только этот.Как прервать поток, созданный внутри метода?

Я создал метод, который стартует в тему, как это:

public static void StartSyncThread() { 
     new Thread() { 
      public void run() { 
        isRunning = true; // Set to true so while loop will start 

        while (isRunning) { 
         ... 
         } 

      } // Close run() 
     }.start(); 

    } 

....

public static void KillSyncThread() { 
    isRunning = false; 
} 
+0

Это должно сработать. Даже если вы не представили декларацию 'isRunning', она будет компилироваться только в том случае, если' isRunning' объявлен как 'boolean' static для окружающего класса. –

+0

Не работает. Даже если логическое значение нестабильно. Когда я вызываю kill, он продолжает работать. – Ducksauce88

+0

Можете ли вы предоставить декларацию 'isRunning'? Я предполагаю, что он объявлен статическим для окружающего класса. Возможно, вы случайно положили 'boolean' из строки' isRunning = true; ', а метод' run() 'не собирал изменения какой-либо другой переменной isRunning? –

ответ

0

Это возможно с вашим кодом, что поток не будет на самом деле начать, прежде чем звонить KillSyncThread. Если это так, то поток установит isRunning в true, а затем продолжит работать вечно. Я бы просто установил isRunning для true, прежде чем вы начнете поток.

Было бы также не остановится, если код в

...

имеет либо бесконечный внутренний цикл или вызов функции блокировки, такие как гнездо для чтения.

+0

У меня есть 'KillSyncThread()', который отправляется с помощью нажатия кнопки, поэтому я вызываю 'Class.KillSyncThread();', и я вызываю его после того, как поток запущен. Я использую system.out. указать, работает ли он или нет. – Ducksauce88

1

Если вы сохранить ссылку на поток:

private static Thread myThread; 

public static void StartSyncThread() { 
    myThread = new Thread() { 
     public void run() {  
      while (!Thread.currentThread().isInterrupted()) { 
         ... 
      } 

     } // Close run() 
    } 
    myThread.start(); 
} 

, то вы можете позвонить

public static void killSyncThread() { 
    if (myThread != null && myThread.isAlive()) { 
     myThread.interrupt(); 
    } 
} 

, чтобы отменить его. Таким образом, вы можете избавиться от статического флага isRunning, interrupt() устанавливает встроенный флаг, который эквивалентен этому, плюс он пробудит поток от сна или ожидания.

Если вы действительно объявили переменную как volatile, то ее обновленное значение должно быть видимым в потоках. Может быть, это проблема с областью определения, где флаг, который вы тестируете, отличается от того, что вы устанавливаете? С глобальным изменчивым состоянием кажется вероятным, что он может быть запутанным быстро. Сделайте небольшой пример и убедитесь сами, что установка флага или прерывание потока работает, и с этой уверенностью вы можете найти реальную проблему.

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