Наследование vs Реализация:
Thread
- это класс, который нужно наследовать (extends)Runnable
- это интерфейс, который нужно реализовывать (implements)Гибкость:
Runnable
ваш класс может наследовать другой класс (так как Java не поддерживает множественное наследование)Thread
вы ограничены, так как уже наследуете Thread и не можете наследовать что-то ещеПовторное использование:
Runnable
можно использовать повторно, передавая один экземпляр в несколько потоковThread
создает новую сущность потока каждый раз// Пример с Thread
class MyThread extends Thread {
public void run() {
System.out.println("Thread is running");
}
}
// Пример с Runnable
class MyRunnable implements Runnable {
public void run() {
System.out.println("Runnable is running");
}
}
Thread:
Runnable:
Runnable
обычно предпочтительнее из-за лучшей архитектурыRunnable
более экономичен по памяти при создании множества потоковRunnable
объект для нескольких потоков// Пример повторного использования Runnable
Runnable sharedRunnable = new MyRunnable();
Thread t1 = new Thread(sharedRunnable);
Thread t2 = new Thread(sharedRunnable);
t1.start();
t2.start();
Thread
- конкретная реализация потокаRunnable
- задача, которая может быть выполнена в потокеRunnable
(и Callable
)Runnable
соответствует принципу единственной ответственности (SOLID)Runnable
позволяет разделить логику задачи и механизм выполнения