JavaRush /Курсы /Модуль 2. Java Core /Создание и запуск новых нитей

Создание и запуск новых нитей

Модуль 2. Java Core
11 уровень , 1 лекция
Открыта

— Привет, Амиго! Элли рассказала тебе о нитях, а я расскажу тебе о том, как с ними работать. Чтобы породить новую нить нужно:

1) Создать объект класса Thread (нить)

2) Передать в него объект, метод которого нужно выполнить

3) Вызвать у созданного объекта Thread метод start.

Пример:

Код Описание
class Printer implements Runnable
{
public void run()
{
System.out.println("I’m printer");
}
}
Класс, который реализует интерфейс Runnable.
public static void main(String[] args)
{
Printer printer = new Printer();
Thread childThread = new Thread(printer);
childThread.start();
}
1 Создали объект класса Printer, который содержит метод run.
2 Создали новый объект класса Thread, передали ему в конструкторе объект printer, чей метод run()нужно будет исполнить.
3 Запустили новую нить в работу, вызовом метода start().

Маленькие программы на Java обычно состоят из одной нити, называемой «главной нитью» (main thread). Но программы побольше часто запускают дополнительные нити, их еще называют «дочерними нитями». Главная нить выполняет метод main и завершается. Аналогом такого метода main, для дочерних нитей служит метод run интерфейса Runnable.

— Ага, много нитей, много методов main.

Создание и запуск новых нитей (трэдов) - 1

— Чтобы указать, с какого именно метода нужно начать выполнение объекту Thread, нужно как-то передать метод этому объекту. В Java это реализовано с помощью интерфейса Runnable. Этот интерфейс содержит единственный абстрактный метод – void run(). Класс Thread имеет конструктор Thread(Runnable runnable), в который можно передать любой объект, который реализует интерфейс Runnable.

Ты должен унаследовать свой класс от интерфейса Runnable, затем переопределить метод run в своем классе. Именно с вызова этого метода начнется работа новой нити. В методе run ты можешь написать все, что хочешь.

Код Описание
class Printer implements Runnable
{
private String name;
public Printer(String name)
{
this.name = name;
}
public void run()
{
System.out.println("I’m " + this.name);
}
}
Класс, который реализует интерфейс Runnable.
public static void main(String[] args)
{
Printer printer1 = new Printer("Коля");
Thread thread1 = new Thread(printer1);
thread1.start();

Printer printer2 = new Printer("Вася");
Thread thread2 = new Thread(printer2);
thread2.start();
}
Создаем две нити, каждая на основе своего объекта типа Printer.
public static void main(String[] args)
{
Printer printer = new Printer("Наташа");

Thread thread1 = new Thread(printer);
thread1.start();

Thread thread2 = new Thread(printer);
thread2.start();

Thread thread3 = new Thread(printer);
thread3.start();
}
Создаем три нити, на основе одного объекта Printer.

Более того, можно совместить это все в одном классе. Класс Thread реализует от интерфейса Runnable, и достаточно просто переопределить его метод run:

Второй способ создания новой нити
class Printer extends Thread
{
private String name;
public Printer(String name)
{
this.name = name;
}
public void run()
{
System.out.println("I’m " + this.name);
}
}
Унаследовались от класса Thread, который реализует интерфейс Runnable, и переопределили метод run.
public static void main(String[] args)
{
Printer printer = new Printer("Вася");
printer.start();

Printer printer2 = new Printer("Коля");
printer2.start();

}
Создаем две нити, каждая на основе своего объекта типа Printer.

— Это решение красивее.

— Да, но у него есть минусы:

1) Вам может понадобиться запустить несколько нитей на основе одного единственного объекта, как это сделано в «примере с Наташей».

2) Если вы унаследовались от класса Thread, вы не можете добавить еще один класс-родитель к своему классу.

3) Если у вашего класса есть класс-родитель, вы не можете добавить второго – Thread.

— Т.е. каждая из нитей после вызова метода start начнет выполнять метод run того объекта, который ему передали в конструкторе?

— Да. А если в конструкторе ничего не передали, то Thread просто исполняет свой внутренний метод run.

— А почему нельзя просто вызвать этот метод, например, так:

Код
public static void main(String[] args)
{
 Printer printer1 = new Printer("Коля");
 printer1.run();
}

— Когда главная нить дойдет до метода run, наш «маленький роботик», просто зайдет внутрь и начнет исполнять все команды, которые там есть внутри, и только после их выполнения, вернется в метод main, и продолжит работу дальше. Создания второго «маленького робота» не произойдет, и вся работа будет делаться последовательно, а не параллельно (одновременно).

— Ясно. А можно вызвать какой-нибудь другой метод, а не run?

— Нет. Все привязано к интерфейсу Runnable, а он «знает» только об одном своем методе – run.

Комментарии (12)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Виктор Уровень 51
6 октября 2025
По привычке поставил во второй задаче ` знак вместо ' и задачу не принял((
Руслан Уровень 46
5 октября 2025
Хорошая лекция , все понятно!!!
Nikstore Уровень 49
16 февраля 2024
задачи такие что ты забываешь, что изучаешь нити и просто вспоминаешь пройденный материал 20+ лекций назад....
Greg Уровень 108 Expert
15 октября 2022
Этот жаргон вводит в ступор - Измени класс Violin так, чтоб он стал таском для нити. Используй интерфейс MusicalInstrument
Greg Уровень 108 Expert
15 октября 2022
Бедная Наташа.
Arthur Kozlov Уровень 51
15 апреля 2025
Очень редкое имя.
Юрий Суботинов Уровень 92 Expert
23 мая 2022
Задача "список и нити", решение через цикл не принимается. Делайте топорно)
Андрей Уровень 69 Expert
30 мая 2022
Когда вначале прочитал, не понял. Когда стал решать, про твой комент забыл, первое что пришло на ум, в цикле забить и тут же в памяти всплыло твое предупреждение, спасибо!
Владимир Уровень 109 Expert
15 июня 2022
принимает через цикл тоже
Александр Ц. Уровень 108 Expert
17 июня 2022
Добавление в List через цикл всё-таки не принимает)
Владимир Уровень 109 Expert
18 июня 2022
в личку отправил
Dinis Shayslamov Уровень 108 Expert
20 июня 2022
у меня при повторной проверке(т.е. я решил сперва топорно а потом переписал код) принял через цикл