потоки java уведомляют

#java #multithreading

#java #многопоточность

Вопрос:

У меня есть 2 класса, fe Class1 и Class2

допустим, я делаю это в Class1:

 Class2 class2 = new Class2();
Thread thread = new Thread(class2);
thread.start();
...
thread.stop();
 

теперь я хочу проверить метод run Class2, когда мой поток останавливается, как я могу это сделать?
Поэтому, когда class1 останавливает поток, я хочу получить некоторое предупреждение class2 о том, что он остановился, а затем выполнить некоторые действия

Комментарии:

1. Вы читали документы API для Thread.stop ? Они серьезны.

2. просто вызовите метод class2 после остановки потока: thread.stop(); class2.doSomething();

Ответ №1:

  1. Не используйте stop() , используйте interrupt() .
  2. Если вы соблюдаете пункт 1, в Class2 вы можете использовать:

 public void run() {
  if(Thread.currentThread().isInterrupted())
    //somebody interrupted me, ouch!
}
 

Комментарии:

1. @Thomas Uhrig: Это по-прежнему лучший ответ, поскольку он делает то, что требуется, и указывает на серьезную проблему в существующем коде.

Ответ №2:

Прежде всего, не используйте thread.stop(), поскольку он устарел. Следовательно, зависимость от таких методов нежелательна. Во-вторых: существует несколько способов ее решения, т.Е. В основном попытка завершить работу или связаться.

  1. Используйте флаг, который уведомляет ваше сообщение. Но убедитесь, что весь вызов потокобезопасен. И своевременно продолжайте проверять, установлен флаг или нет. Если установлено, выполните желаемое действие.
  2. Прерывания — это идеальный способ уведомления другого потока. Политика поддержки и прерывания гласит: что когда-либо прерывание генерируется в потоке A, а политика прерывания A заключается в завершении работы. т.е. всякий раз, когда он получает прерывание. Сделайте runnable таким, чтобы он своевременно проверял прерывание и, если прерывание установлено, закрывал службу. Проверка состояния с помощью Thread.currentThread().isInterrupted() обычных прерываний в основном используется для уведомления других пользователей о том, что он запрашивает его завершение работы. (Брайан Гетц «Параллелизм на практике» имеет отличную главу об этом).

Комментарии:

1. Основная причина, по которой Thread.stop() не следует использовать, заключается не в том, что он устарел, а в том, почему он устарел: он может оставить приложение в несогласованном состоянии, потому что он не может быть реализован таким образом, чтобы соблюдались гарантии согласованности в коде.

2. download.oracle.com/javase/1.4.2/docs/guide/misc /… является отличной ссылкой на то, почему он был устаревшим.

Ответ №3:

Как только поток «останавливается», это означает, что run метод Class2 завершен. Поэтому нет способа, чтобы код в run методе, который выполняет after поток, был остановлен.

Вы можете прослушивать прерывание и обрабатывать его, но эта обработка будет выполняться, пока поток все еще выполняется.

У вас также может быть другой метод, из Class2 которого вы могли бы вызывать Class1 после остановки потока.

Ответ №4:

Ваш class2 должен получить исключение InterruptedException и все. Кстати http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html#stop ()

Из интереса, чего вы пытаетесь достичь?