Почему "implements Runnable" предпочтительнее ,чем "extends Thread"? [дубликат]


На этот вопрос уже есть ответ здесь:

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

Приношу свои извинения, если мой голос звучит сбивчиво..!

5 25

5 ответов:

Наиболее распространенное Различие:

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

Однако существенная разница есть.

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

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

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

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

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

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

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