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