Потоки Java - Остановка потока от запуска через другой поток, делающий вызов метода - PullRequest
1 голос
/ 25 марта 2012

У меня есть класс Runnable, который я пишу.Внутри него у меня есть два метода.Метод run () и другой метод с именем stopRunning ().Функция stopRunning () должна вызываться отдельным потоком от потока, в котором выполняется метод run (), и должна останавливать запуск потока, выполняющего метод run ().

Вот фрагмент кода:

public class myRunnable implements Runnable
{
    private boolean stillRunning = true;

    public void stopRunning()
    {
        synchronized (this)
        {
           stillRunning = false;
        }
    }

    public void run()
    {
       while (stillRunning)
       {
          synchronized (this)
          {
             // do some stuff that doesn't involve the isPlaying var
          }
       }
    }

}

Код выглядит правильно?Нужно ли выполнять синхронизацию, чтобы гарантировать, что изменение isPlaying будет распознано потоком, выполняющим метод run ()?

Кроме того, нужно ли здесь вызывать notify () или notifyAll () для этогоРабота?Я почти уверен, что не знаю, так как никогда не вызываю wait (), но я не уверен на 100%.

РЕДАКТИРОВАТЬ: woops, мой код был неправильным.Я использовал неправильное имя для логического, извините за это.Это сейчас исправлено.

Ответы [ 4 ]

3 голосов
/ 25 марта 2012

Для запуска и остановки потока Java Thread API уже предоставляет необходимую вам функцию. Thread.interrupt() и Thread.interrupted() могут быть использованы для достижения того, что вы хотите.

public class MyThread extends Thread{
  public void run(){
    while(!interrupted()){
      try{
        // Place your code here
      }catch(InterruptedException e){
        break;
      }
    }
  }
}

Всякий раз, когда вы хотите прервать MyThread, просто позвоните MyThread.interrupt()

1 голос
/ 25 марта 2012

вы должны объявить stillRunning как переменную типа volatile, например:

public class OurThread extends Thread(){
  private volatile boolean stop = false;
  public void run(){
    while (!stop) {
    //Do your actions
    }
  }
}

проверьте эту ссылку http://www.asjava.com/core-java/three-ways-to-stop-java-thread/

также проверьте эту ссылку о летучих переменных http://www.javamex.com/tutorials/synchronization_volatile.shtml

1 голос
/ 25 марта 2012

Это прекрасно работает, более простая альтернатива, которая не вызовет головной боли при синхронизации, если вы добавите больше функций, - это просто объявить sillRunning как volatile.

И, как вы говорите, nofity () делает только что-то полезное в сочетании с ожиданием. Это не имеет ничего общего с тем, что вы здесь делаете.

0 голосов
/ 25 марта 2012

Для надежности вам необходимо применить некоторую защиту MT к переменной stillRunning.Вы можете сделать это изменчивым, как другие отметили.Или вы можете обернуть его в синхронизированный блок.Это может быть полезно, если необходимо выполнить другие действия, помимо установки / проверки stillRunning.

Обратите внимание, что без защиты MT ваш код может работать в таких вещах, как модульные тесты, которые не запускаются под большой нагрузкой.Но это не будет надежно в производственных условиях.

Что касается вашего комментария о notify (), notifyAll ();это используется для пробуждения потоков, которые заблокированы, и для сигнализации о том, что он приступил к проверке состояния.Ваш пример, похоже, не нуждается в этом.В настоящее время notify () / wait () считается довольно низким уровнем, и Java имеет несколько API-интерфейсов для обработки потоков (например, защелки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...