Сценарий расширения класса Thread и реализации интерфейса Runnable

Я новичок в программировании потоков в Java и, следовательно, этот основной вопрос. (Я проверил, но не смог найти ранее заданный вопрос)

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

public class ThreadExample extends Thread implements Runnable {
}

Мне было интересно, какая ситуация захочет этого, и если есть какое-то преимущество в этом, что это такое.

Ответ 1

расширение Thread и реализация Runnable бесполезно (Thread уже реализует Runnable). Вы почти всегда хотите реализовать Runnable (и не расширять Thread). Это дает вам возможность использовать Thread напрямую (не рекомендуется) или использовать одну из новых реализаций ThreadPool в java.util.concurrent (рекомендуется).

Ответ 2

Нет, нет никакого преимущества в использовании этого подхода, потому что класс Thread реализует интерфейс Runnable. Итак, если ваш класс расширяет класс Thread. Это означает, что он также реализует интерфейс Runnable.

http://www.developerfusion.com/pix/articleimages/may05/javathread3.jpg

Ответ 3

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

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

Он особенно полезен с интерфейсами маркеров (некоторые могут возражать, что их нельзя использовать вообще, а это плохая практика - ну иногда вы не полностью контролируете среду), то есть интерфейсы с фактической реализации и просто предназначен для обозначения вашего объекта, имеющего право на специальную функцию (например, Cloneable). В этом случае маркировка каждого из разрешенных классов, даже если их родители уже имеют право, может быть более явным, поэтому более полезно.

Ответ 4

Управляемый интерфейс означает назначение одного задания для многих потоков в то время как класс Thread, каждый из потоков имеет уникальный объект, связанный с ним.

Ответ 5

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