Многопоточность в Java. создание и запуск потоков с помощью Thread
Last updated: 6 мая 2025 г.Создать нить(поток) можно тремя способами:
- расширяя
Thread
; - реализуя
Runnable
; - расширяя
Callable
;
Код класса расширяющего или реализующего что-нибудь выше перечисленное будет выполняться в отдельном потоке.
Мы уже затрагивали создание потоков когда рассматривали PipedOutputStream. И мы помним, что там было два потока и код одного потока выполнялся параллельно коду другого.
Поэтому суть потоков думаю понятна. Параллельное выполнение блоков кода друг другу.
Расширение Thread
Ниже в примере класс MyThread
расширяет Thread
.
Это значит, что в нем должен быть переопределен метод run
.
В этом методе пишется код, который можно запускать в отдельном потоке.
То есть он будет выполняться параллельно другому коду, например тому, в котором выполняется код метода мейн.
Пример программы:
1class MyThread extends Thread {
2 @Override
3 public void run() {
4 System.out.println("run() method ");
5 }
6}
7
8public class ExtendsThread {
9 public static void main(String[] args) {
10 //В отличие от реализации Runnable (разберем
11 //в следующем уроке) для каждого потока класса
12 //расширяющего Thread необходимо создавать новый
13 //объект. Создаются три новых объекта MyThread
14 //как можно увидеть
15 MyThread t1 = new MyThread();
16 MyThread t2 = new MyThread();
17 MyThread t3 = new MyThread();
18 //Теперь с помощью метода start в одном потоке
19 //запускается выполнение метода run у объекта t1,
20 //в другом потоке запускается выполнение метода
21 //run у объекта t2 и в третьем потоке запускается
22 //выполнение метода run у объекта t3.
23 //И ясное дело все эти потоки выполняются
24 //параллельно друг другу.
25 t1.start();
26 t2.start();
27 t3.start();
28 }
29}
Вывод:

Каждый поток вывел по строке как видим.
Преимущества расширения Thread
Основное преимущество расширения Thread в том, что есть возможность переопределять не только run()
, но и другие методы, такие как start()
.
Пример программы:
1class MyThread extends Thread {
2 @Override
3 public void start() {
4 System.out.println("Overriding a start() method");
5 super.start();
6 }
7
8 @Override
9 public void run() {
10 System.out.println("run() method ");
11 }
12}
13
14public class ExtendsThread {
15 public static void main(String[] args) {
16 MyThread t1 = new MyThread();
17 MyThread t2 = new MyThread();
18 MyThread t3 = new MyThread();
19 t1.start();
20 t2.start();
21 t3.start();
22 }
23}
Вывод:

Как видим, теперь и при вызове start тоже выводиться строка.
Причем порядок выведения строк на консоль может быть разный. В данном случае, на консоли мы видим, что один поток уже успел завершить свое выполнение перед тем как запустился третий поток.
Дополнительные материалы
Официальная документация по классу Thread
Сравнение Thread, Runnable и Callable на Stack Overflow
Основы многопоточности от Jenkov
Следующие уроки
Интерфейс Runnable в Java
10
мин.
Volatile переменная в Java
9
мин.
Метод join в Java
11
мин.