Я бы сказал, что расширение Thread
было ненужным, и поэтому реализация Runnable
предпочтительнее.
Но важно то, что код знает, что поток собирается выйти. Если ваш код является частью какого-то общего интерфейса обратного вызова, вы не можете знать, как его используют. Вы можете быть переданы в пул потоков (действительно, нам, вероятно, следует использовать пулы, а не создавать Thread
s в неподходящих точках в коде). OTOH, обычно Runnable
- это анонимный внутренний класс и, следовательно, на уровне источника, часть включающего метода, который действительно знает, что происходит.
Таким образом, если поток собирается завершить работу, сброс состояния прерывания в текущем потоке не имеет смысла, поскольку прерывать нечего.
В какой-то момент вы захотите сказать, что оно достаточно прервано. Например, пулы потоков могут продолжать использовать поток даже после того, как задача была прервана, хотя они могут захотеть сохранить InterruptException
для вызывающих, которые пытаются поднять задачу.
Библиотеки, как правило, неправильно обрабатывают прерывания. ИМО, прерывания не имеют смысла. Без них жизнь была бы намного проще, к сожалению, они дают о себе знать.