Подтвердить что ты не робот

Почему "реализует Runnable" предпочтительнее "extends Thread"?

Java Thread сам реализует Java Runnable! и, по мнению большинства экспертов по Интернету, реализует Runnable предпочтительнее, чем extends Thread! даже если мы не можем использовать использование Runnable в смысле потока без класса Thread!
Тогда почему мы предпочитаем реализовать Runnable по расширению Thread, поскольку в обоих случаях фактический поток указан путем вызова метода Thread (т.е. start() или run()), хотя в случае Thread мы действительно не расширяют функциональность Thread, просто переопределяя метод run()?

Я извиняюсь, если я сбиваю с толку..!

4b9b3361

Ответ 1

Наиболее распространенное различие заключается в следующем:

Когда вы расширяете класс Thread, вы не можете расширить любой другой класс, который вам нужен. (Как вы знаете, Java не позволяет наследовать более одного класса). Когда вы реализуете Runnable, вы можете сохранить пространство для своего класса для расширения любого другого класса в будущем или сейчас.

Однако значительная разница.

Когда вы расширяете класс Thread, каждый ваш поток создает уникальный объект и связывается с ним. Когда вы реализуете Runnable, он разделяет один и тот же объект на несколько потоков.

Проверьте это: http://manikandanmv.wordpress.com/tag/extends-thread-vs-implements-runnable/

Ответ 2

Если ваш класс расширяет класс Thread, он становится единственным потоком, который наследует свойства класса Thread, поэтому он будет тяжелым. (При расширении класса Thread каждый из потоков создает уникальный объект и ассоциируется с ним, но при реализации Runnable он разделяет один и тот же объект с несколькими Threads).

Если ваш класс реализует интерфейс Runnable, вы переопределяете только run(). Таким образом, этот экземпляр создает отдельный Thread, и каждый отдельный поток запускается отдельно, но не как один тяжелый поток в вашей программе. Другое дело: поскольку Java не поддерживает множественное наследование, если вы реализуете Runnable, вы избежите проблем с множественным расширением, поэтому, если вы реализуете интерфейс Runnable, вы можете расширить любой класс, который вам нужен, кроме класса Thread.

Ответ 3

Класс может иметь только один суперкласс, но может реализовывать любое количество интерфейсов. Расширяя Thread, вы отказываетесь от возможности подкласса что-либо еще.

Ответ 4

Java допускает только одно наследование, а это означает, что если вы наследуете от Thread, вы не сможете наследовать ни одного другого класса. Внедрение интерфейса Runnable не имеет этого ограничения, так как вашему классу разрешено реализовать любое количество интерфейсов.

Ответ 5

вы действительно сбиваете с толку. В любом случае, я знаю, что, поскольку мы можем достичь той же функциональности с помощью Runnable, поэтому мы должны пойти на это, потому что, если мы будем внедрять Runnable, мы можем расширить другой класс, что невозможно, если мы продолжим Класс темы