Как поток должен закрыть себя в Java?
Это короткий вопрос. В какой-то момент моя нить понимает, что это должно быть самоубийство. Каков наилучший способ сделать это:
- нить.currentThread().прервать();
- возврат;
кстати, почему в первом случае нужно использовать currentThread? Это Thread не относится к текущей теме?
5 ответов:
если вы хотите расторгнуть thread, то возвращается нормально. Вам не нужно звонить
Thread.currentThread().interrupt()(он не будет делать ничего плохого, хотя. Просто тебе это не нужно.) Это потому чтоinterrupt()в основном используется для уведомления владельца потока (ну, не на 100% точно, но вроде). Поскольку вы являетесь владельцем потока, и вы решили прекратить поток, нет никого, чтобы уведомить, так что вам не нужно вызывать его.кстати, почему в первом случае мы нужно использовать currentThread? Резьба не относится к текущему потоку?
Да, это не так. Я думаю, это может быть запутанным, потому что, например, резьбы.sleep () влияет на текущий поток, но поток.sleep () - это статический метод.
если вы не являетесь владельцем потока (например, если вы не расширили
Threadи закодировал aRunnableetc.) вы должны сделатьThread.currentThread().interrupt(); return;таким образом, любой код, который вызвал ваш runnable будет знать поток прерывается = (обычно) должен остановить все, что он делает, и завершить. Как я уже говорил ранее, это всего лишь механизм общения. Владелец может просто игнорировать прерванный статус и ничего не делать.. но если вы установите статус прерывания, кто-то может поблагодарить вас за это в будущем.
по той же причине, вы никогда не должны делать
Catch(InterruptedException ie){ //ignore }потому что если вы это сделаете, вы остановите сообщение там. Вместо этого нужно сделать
Catch(InterruptedException ie){ Thread.currentThread().interrupt();//preserve the message return;//Stop doing whatever I am doing and terminate }
если метод run заканчивается, поток завершится.
Если вы используете цикл, правильный способ выглядит следующим образом:
// In your imlemented Runnable class: private volatile boolean running = true; public void run() { while (running) { ... } } public void stopRunning() { running = false; }конечно, возвращение это лучший способ.
Если вы находитесь на верхнем уровне - или в состоянии чисто get на верхний уровень-из потока, то просто возвращение приятно. Выбрасывание исключения не так чисто, как вам нужно быть в состоянии проверить, что ничто не собирается ловить исключение и игнорировать его.
причина, по которой вы должны использовать
Thread.currentThread()для того, чтобы позвонитьinterrupt()этоinterrupt()Это метод экземпляра - вам нужно вызвать его в потоке, который вы хотите прервать, который в вашем случае является текущим нитка. Обратите внимание, что прерывание будет замечено только в следующий раз, когда поток заблокируется (например, для ввода - вывода или для монитора) в любом случае-это не означает, что исключение будет немедленно вызвано.
если вы просто позвоните
interrupt()поток не будет автоматически закрыто. Вместо этого поток может даже дальше жить, еслиisInterrupted()реализуется соответственно. Единственный способ гарантированно закрыть поток, как и просил OP, являетсяThread.currentThread().stop();метод устарел, однако.
вызов
returnвозвращает только из текущего метода. Это только завершает поток, если вы находитесь на его верхнем уровне.тем не менее, вы должны работать с
interrupt()и построить свой код вокруг него.
Thread-это класс, а не экземпляр; currentThread () - это статический метод, который возвращает экземпляр потока, соответствующий вызывающему потоку.
использовать (2). прерывание () немного жестоко для нормального использования.
Comments