Как указывается в статье, они оба "работают", хотя в целом вы должны использовать Runnable
(или, если нужны аргументы / результат Callable
с Future
), а не подклассы Thread
.Как вы заметили, это более гибкий подход - он отделяет то, что исполняется, от того, кто его выполняет.Расширение Thread излишне объединяет эти две концепции в одном и том же экземпляре, нарушая принцип ОО единственная ответственность .
Иногда вам придется реализовывать исполняемый код как подкласс Thread, когда вашрука вынуждена API.Например, Runtime. addShutdownHook (Thread) требует, чтобы ваш код, выполняемый при завершении работы, был зарегистрирован как экземпляр Thread.Но если вы не имеете дело с одним из этих конкретных случаев, всегда используйте Runnable
.