Класс Runnable
Класс Runnable - это функциональный интерфейс из пакета
java.lang, который представляет собой задачу,
предназначенную для выполнения в отдельном потоке.
Он содержит единственный метод run, в котором
описывается код, выполняемый потоком. Объект Runnable
передается в конструктор класса Thread или в
метод execute исполнителя ExecutorService.
Поскольку интерфейс функциональный, его можно реализовать
с помощью лямбда-выражения или ссылки на метод.
Синтаксис
@FunctionalInterface
public interface Runnable
{
void run();
}
Пример
Давайте создадим задачу через анонимный класс и запустим ее в отдельном потоке:
public class Main
{
public static void main(String[] args)
{
Runnable task = new Runnable()
{
@Override
public void run()
{
System.out.println("task is running");
}
};
Thread thread = new Thread(task);
thread.start();
}
}
Результат выполнения кода:
"task is running"
Пример
Так как Runnable - функциональный интерфейс,
ту же задачу можно записать короче через лямбда-выражение:
public class Main
{
public static void main(String[] args)
{
Runnable task = () -> System.out.println("task is running");
Thread thread = new Thread(task);
thread.start();
}
}
Результат выполнения кода:
"task is running"
Пример
Давайте передадим Runnable напрямую в конструктор
потока без промежуточной переменной:
public class Main
{
public static void main(String[] args)
{
Thread thread = new Thread(() -> {
for (int i = 1; i <= 3; i++)
{
System.out.println("step " + i);
}
});
thread.start();
}
}
Результат выполнения кода:
"step 1"
"step 2"
"step 3"
Пример
Давайте запустим несколько задач Runnable в пуле
потоков через ExecutorService:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main
{
public static void main(String[] args)
{
ExecutorService executor = Executors.newFixedThreadPool(2);
Runnable task = () -> System.out.println(
Thread.currentThread().getName() + " works"
);
executor.execute(task);
executor.execute(task);
executor.shutdown();
}
}
Результат выполнения кода:
"pool-1-thread-1 works"
"pool-1-thread-2 works"