Какая разница между Thread class и Runnable interface?qa-43

Основные отличия

  1. Наследование vs Реализация:

    • Thread - это класс, который нужно наследовать (extends)
    • Runnable - это интерфейс, который нужно реализовывать (implements)
  2. Гибкость:

    • При использовании Runnable ваш класс может наследовать другой класс (так как Java не поддерживает множественное наследование)
    • С Thread вы ограничены, так как уже наследуете Thread и не можете наследовать что-то еще
  3. Повторное использование:

    • 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");
    }
}

Когда что использовать

  1. Thread:

    • Когда нужно переопределить другие методы Thread кроме run()
    • В простых приложениях с минимальной многопоточностью
  2. Runnable:

    • В большинстве случаев (лучшая практика)
    • Когда нужна большая гибкость в проектировании
    • В thread pools (ExecutorService принимает 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 - задача, которая может быть выполнена в потоке
  • В современных Java-приложениях предпочтение отдается RunnableCallable)
  • Runnable соответствует принципу единственной ответственности (SOLID)
  • Использование Runnable позволяет разделить логику задачи и механизм выполнения