Методы потоков destroy
и stop
по своей природе подвержены тупику и небезопасны.Их существование также создает иллюзию того, что может быть какой-то способ немедленно прекратить другой поток, когда что-то еще скажет.
Я понимаю ваше мышление, с вашей точки зрения, это один из основных потоков, и когда этот потокВы не получили ответ от своего рабочего потока в то время, как вы хотели бы его убить и перезапустить, , не заботясь о том, что он до .Но причина, по которой эти методы устарели, заключается в том, что вы должны заботиться о том, что задумал поток.Много.
Что если у потока есть блокировка вокруг переменной, которую вам нужно использовать позже?Что если у потока открыт дескриптор файла?Во всех этих случаях и во многих других случаях простое прекращение потока во время его текущей операции может привести к путанице - вполне вероятно, что ваше приложение просто рухнет дальше.
Итак, для того, чтобы поток былпрерываемый или отменяемый или останавливаемый, он должен справиться с этим сам.Если поток или операция не могут прервать себя, то вы не можете прервать его - предполагается, что это будет небезопасно.
Если вы работаете, буквально
public void run() {
doSomething();
}
тогда нет способа прервать это.Можно было бы надеяться, что если бы doSomething
была длительной операцией, то мог бы существовать способ либо поэтапного взаимодействия с ним с чем-то вроде
public void run() {
while (running) {
MyParser.parseNext();
}
}
, либо возможность передачи переменной по ссылке, которая указывает, является липоток прерывается или нет, и, надеюсь, метод прервет себя в подходящем месте.
Помните, что операция blocking
блокирует.Нет способа обойти это, вы не можете отменить его частично.