Класс Thread
Класс Thread представляет собой поток выполнения программы.
Каждая программа на Java запускается в главном потоке, который
создается автоматически виртуальной машиной. С помощью класса
Thread можно создавать дополнительные потоки, которые
будут выполняться параллельно с главным потоком. Для создания
потока нужно либо унаследоваться от класса Thread и
переопределить метод run, либо передать объект
Runnable в конструктор. Запуск потока выполняется
методом start, а не прямым вызовом run.
В конструктор класса Thread можно передать объект
Runnable, который содержит код для выполнения в потоке.
Также можно передать имя потока в качестве второго параметра.
Класс Thread реализует интерфейс Runnable,
поэтому его можно использовать везде, где ожидается
Runnable.
Синтаксис
// Способ 1: наследование от Thread
class MyThread extends Thread
{
public void run()
{
// код потока
}
}
// Способ 2: передача Runnable
Thread thread = new Thread(new Runnable()
{
public void run()
{
// код потока
}
});
// Способ 3: лямбда-выражение
Thread thread = new Thread(() -> {
// код потока
});
// Запуск потока
thread.start();
Пример
Давайте создадим поток через наследование от класса
Thread и запустим его:
public class Main
{
public static void main(String[] args)
{
MyThread thread = new MyThread();
thread.start();
System.out.println("Main thread");
}
}
class MyThread extends Thread
{
public void run()
{
System.out.println("Child thread");
}
}
Результат выполнения кода:
"Main thread"
"Child thread"
Порядок вывода может меняться, так как потоки выполняются параллельно.
Пример
Давайте создадим поток через передачу объекта
Runnable в конструктор:
public class Main
{
public static void main(String[] args)
{
Thread thread = new Thread(new Runnable()
{
public void run()
{
System.out.println("Runnable thread");
}
});
thread.start();
}
}
Результат выполнения кода:
"Runnable thread"
Пример
Давайте создадим поток с помощью лямбда-выражения и зададим ему имя:
public class Main
{
public static void main(String[] args)
{
Thread thread = new Thread(() -> {
System.out.println(Thread.currentThread().getName());
}, "MyThread");
thread.start();
}
}
Результат выполнения кода:
"MyThread"
Пример
Давайте дождемся завершения потока с помощью метода
join:
public class Main
{
public static void main(String[] args) throws InterruptedException
{
Thread thread = new Thread(() -> {
System.out.println("Child thread");
});
thread.start();
thread.join();
System.out.println("Main thread");
}
}
Результат выполнения кода:
"Child thread"
"Main thread"