Ответ
Runnable — это функциональный интерфейс в Java, представляющий задачу, которую можно выполнить асинхронно, обычно в отдельном потоке. Он содержит единственный абстрактный метод void run().
Основное назначение: Отделение логики задачи от механизма её выполнения (потока Thread).
Синтаксис и примеры:
// 1. Классическая реализация через анонимный класс
Runnable task1 = new Runnable() {
@Override
public void run() {
System.out.println("Task 1 is running.");
}
};
// 2. Реализация через лямбда-выражение (Java 8+)
Runnable task2 = () -> {
for (int i = 0; i < 3; i++) {
System.out.println("Task 2, iteration: " + i);
}
};
// 3. Запуск задачи в новом потоке
Thread thread = new Thread(task2);
thread.start();
Основные способы выполнения:
- Через класс
Thread:new Thread(runnableTask).start(). - Через
ExecutorService(рекомендуемый способ):ExecutorService executor = Executors.newFixedThreadPool(2); executor.submit(task1); // Передаем Runnable на выполнение в пул executor.shutdown();
Ключевые отличия от Callable<V>: |
Runnable |
Callable<V> |
|---|---|---|
Метод void run() не возвращает результат. |
Метод V call() возвращает результат типа V. |
|
Не может выбрасывать проверяемые исключения (throws). |
Может выбрасывать проверяемые исключения. | |
Используется с ExecutorService.submit(Runnable). |
Используется с ExecutorService.submit(Callable), возвращает Future<V>. |
Практическое правило: Используйте Runnable для задач, которые не требуют возврата результата, и Callable — когда результат нужен. Для управления потоками всегда предпочитайте ExecutorService прямому созданию Thread.