Почему существует "extends Thread", когда "реализует Runnable" является победителем во всех случаях

Я знаю, что implements Runnable предпочитается над extends Thread в потоках Java, поскольку он позволяет нам расширить какой-либо другой класс, если это необходимо. Но если это так, то extends Thread также имеет свои преимущества перед implements Runnable, и если да, то каковы эти преимущества?

Ответы

Ответ 1

Потому что иногда (почти никогда, но иногда) вы хотите изменить основное поведение Thread.

Это, когда вам нужно будет продлить его.

Вы можете изменить его, переопределив метод из класса Thread, вы не можете сделать это, выполнив один из Runnable.

Ответ 2

За последние 20+ лет, прошедших с момента выпуска Java 1.0, из-за того, что считается хорошим шаблоном дизайна, он изменился. Тем не менее, Java привержена обратной совместимости, что означает, что старый код, который может использовать плохие шаблоны проектирования, по-прежнему будет работать.

Один из моих любимых ненавистников - StringBuffer, для которого никогда не было хорошей идеи сделать его синхронизированным методом, было заменено более десятка лет назад, но, к сожалению, разработчикам не мешают использовать его сегодня, и даже новые разработчики используют его, хотя он устарел задолго до того, как они начали использовать Java.