Разница между инструментами Runnable и extends Thread в Java
Java допускает только одно наследование, а это означает, что если вы наследуете Thread, вы не сможете наследовать ни один другой класс. Внедрение интерфейса Runnable не имеет этого ограничения, так как вашему классу разрешено реализовать любое количество интерфейсов.
Если вы расширите класс Thread, все методы класса Thread наследуют ваш класс, который вам может не понадобиться. Это вызовет дополнительные накладные расходы. Вы можете удалить эти служебные данные, реализовав интерфейс Runnable.
В ООП (объектно-ориентированное программирование) расширение класса означает модификацию или улучшение существующего класса. Если вы не изменяете класс, это не является хорошей практикой для его расширения. Таким образом, внедрение Runnable будет лучшей объектно-ориентированной проектной практикой.
Внедряя Runnable, несколько потоков могут совместно использовать экземпляр вашей работы. Если вы расширили Thread, вам нужно будет создать новый экземпляр вашей работы для каждого потока.
Разделение задачи как Runnable означает, что мы можем повторно использовать задачу, а также иметь свободу ее выполнения из разных средств, так как вы не можете перезапустить Thread после его завершения. Таким образом, снова «реализует Runnable» и «extends Thread» для задачи, реализация Runnable будет лучшим выбором.