#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:
- Не используйте
stop()
, используйтеinterrupt()
. - Если вы соблюдаете пункт 1, в
Class2
вы можете использовать:
public void run() {
if(Thread.currentThread().isInterrupted())
//somebody interrupted me, ouch!
}
Комментарии:
1. @Thomas Uhrig: Это по-прежнему лучший ответ, поскольку он делает то, что требуется, и указывает на серьезную проблему в существующем коде.
Ответ №2:
Прежде всего, не используйте thread.stop(), поскольку он устарел. Следовательно, зависимость от таких методов нежелательна. Во-вторых: существует несколько способов ее решения, т.Е. В основном попытка завершить работу или связаться.
- Используйте флаг, который уведомляет ваше сообщение. Но убедитесь, что весь вызов потокобезопасен. И своевременно продолжайте проверять, установлен флаг или нет. Если установлено, выполните желаемое действие.
- Прерывания — это идеальный способ уведомления другого потока. Политика поддержки и прерывания гласит: что когда-либо прерывание генерируется в потоке 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 ()
Из интереса, чего вы пытаетесь достичь?