Запуск потока в Java
Объект Thread после new ещё не выполняет
код задачи. Планировщик JVM подключается только после
start(): создаётся новый поток ОС, и уже в нём
вызывается run().
Если вызвать run() напрямую с главного потока,
работа пройдёт как обычный метод без параллелизма.
Повторный start() на том же объекте запрещён и
даст IllegalThreadStateException.
Минимальный параллельный запуск:
public class Main {
public static void main(String[] args) {
Thread worker = new Thread(() -> {
System.out.println("worker");
}, "worker");
worker.start();
System.out.println("main");
}
}
Строки main и worker могут появиться в
разном порядке: планировщик не гарантирует, кто успеет
первым. На это опираются только явные барьеры вроде
join, о которых в следующем уроке.
Сравнение неправильного вызова run() и правильного
start():
public class Main {
public static void main(String[] args) {
Thread t = new Thread(() -> System.out.println("job"));
t.run();
System.out.println("after run");
Thread t2 = new Thread(() -> System.out.println("job2"));
t2.start();
System.out.println("after start");
}
}
После run() сообщение задачи и after run
идут строго друг за другом в главном потоке. После
start() порядок снова может меняться.
Запустите поток с лямбдой, печатающей "tick". Сразу после старта выведите
"tock" из main. Запустите программу
несколько раз и зафиксируйте, меняется ли порядок
строк.