JavaRush /Курсы /Java Core /Остановить бушующий поток: неофициальная версия

Остановить бушующий поток: неофициальная версия

Java Core
6 уровень , 8 лекция
Открыта

— Привет, Амиго! Вот интересный вопрос, с которым ты уже столкнулся или столкнёшься в ближайшее время. А как остановить запущенную нить?

Допустим, пользователь отдал программе команду «загрузить файл из интернета». Главная нить создала для этого задания отдельную дочернюю нить, и передала ей объект, метод run которого содержит все необходимые действия для скачивания файла.

А тут пользователь – раз и передумал. Не хочет он качать этот файл. Как отменить задание и остановить нить?

— Да, как?

— Никак. Это и есть самый общий и самый правильный ответ. Нить остановить нельзя, она может остановиться только сама.

Но можно дать нити сигнал, сообщить ей каким-нибудь образом, что работу больше выполнять не нужно, и ей нужно завершиться. Так же, как главная нить завершается вместе с выходом из метода main, чтобы завершить дочернюю нить, она должна закончить выполнение метода run.

— И как это лучше всего сделать?

— Можно завести какую-нибудь переменную, например типа boolean. Если она true – нить работает. Если же она стала false – нить должна завершиться. Например, так:

Код Описание
class Clock implements Runnable {
    public void run() {
        while (true) {
            Thread.sleep(1000);
            System.out.println("Tik");

            if (!ClockManager.isClockRun) return;
        }
    }
}
Класс Clock (часы) будет вечно писать в консоль раз в секунду слово «Tik»

Если переменная ClockManager.isClockRun равна false – метод run завершится.

class ClockManager {
    public static boolean isClockRun = true;
    public static void main(String[] args) {
        Clock clock = new Clock(); Thread clockThread = new Thread(clock); clockThread.start();

        Thread.sleep(10000);
        isClockRun = false;
    }

}
Главная нить, запускает дочернюю нить – часы, которая должна работать вечно.

Ждет 10 секунд и подает часам сигнал на завершение.

Главная нить завершает свою работу.

Нить часов завершает свою работу.

— А если у нас несколько нитей, что тогда?

— Тогда лучше завести такую переменную для каждой нити. Удобнее всего будет добавить ее прямо в класс. Можно добавить туда переменную boolean isRun. Хотя лучше добавить переменную boolean isCancel, которая будет принимать значение true, если задание отменено.

Код Описание
class Clock implements Runnable {
    private boolean isCancel = false;

    public void cancel() {
        this.isCancel = true;
    }

    public void run() {
        while (!isCancel) {
            Thread.sleep(1000);
            System.out.println("Tik");
        }
    }
}
Класс Clock (часы) будет писать в консоль раз в секунду слово «Тик», пока переменная isCancel равна false.

Когда переменная isCancel станет равной true, метод run завершится.

public static void main(String[] args) {
    Clock clock = new Clock(); Thread clockThread = new Thread(clock); clockThread.start();

    Thread.sleep(10000);
    clock.cancel();
}
Главная нить, запускает дочернюю нить – часы, которая должна работать вечно.

Ждет 10 секунд и отменяет задание, вызовом метода cancel.

Главная нить завершает свою работу.

Нить часов завершает свою работу.

— Буду знать, спасибо, Элли.

Комментарии (272)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
3 сентября 2025
Сделайте пожалуйста выравнивание кода в примерах.
Anonymous #3585174 Уровень 33
22 августа 2025
like
Hack Уровень 32
29 апреля 2025
я прошел все модули джавараш кто начал проходит советую не бросать так как здесь показывают низкоуровневые реализации программы это очень важно для дальнейшего изучения и понимания и изучите паттерны проектирования для понимания примерно как реализованы фреймворки и библиотеки
Олег Сычев Уровень 12
10 мая 2025
Паттерны проектирования будут в курсе?
Hack Уровень 32
11 мая 2025
да фабрика, синглтон, команда, фабричный метод, абстрактная фабрика, прокси, декоратор, фасад
Олег Сычев Уровень 12
11 мая 2025
Спасибо!)
13 Уровень 34
20 мая 2025
🫡
Anonymous #463526 Уровень 1
18 апреля 2025

class Clock implements Runnable
{
public void run()
{
while (true)
{
Thread.sleep(1000);
System.out.println("Tik");

if (!ClockManager.isClockRun) return;
}
}
}
тут что-то или с кодом или с форматированием, сразу и не понять
Victor Уровень 36
10 апреля 2025
По-моему это про потоки: Я - пущеная стрела, И нет зла в моeм сердце, но Кто-то должен будет упасть всe равно.
Артём Пъ Уровень 32
27 января 2025
Топаю по JavaRush с 27.11.24 без остановок и передыха. Это работает, если делать и знать, что это всё не зря!!! Сегодня 27.01.25 - и я полон сил следовать далее... to be continue! Так что, поддержка всем дошедшим!
j1nDo Уровень 29
10 ноября 2024
Застрял на 26 уровне на месяц, много работы и времени совсем не оставалось, но сейчас нашел новые силы и продолжаю изучать материал. Всем удачи))
zabungalilovo Уровень 17
4 ноября 2024
Ты, читающий это, оставь коммент тут! Да-да, именно ты! Много бойцов пало, но мы стойкие и должны держаться друг друга. Грустно видеть околонулевой актив под лекциями, поэтому наводите суету, показывайте что вы тут были и пошли дальше, мотивируйте друг друга, делитесь мыслями, впечатлениями, проблемами и успехами! Так учиться намного легче и продуктивнее!
Aboba Уровень 29
9 ноября 2024
Держать строй бойцы! У самого есть некоторые проблемы с запоминанием и пониманием материала, но нужно двигаться дальше, не всегда есть темы, которые можно и нужно разобрать здесь и сейчас
gerafen Уровень 29
10 ноября 2024
на месте
zabungalilovo Уровень 17
12 ноября 2024
как успехи? какие впечатления от модуля?
gerafen Уровень 29
13 ноября 2024
нормально, только задачки в конце уровня немного утомляют жёстко
ВК Уровень 36
9 декабря 2024
Оставляю. Вы то сами держитесь?)
Адилет А. Уровень 1
9 декабря 2024
суету навести охота
rockentrav Уровень 34
14 декабря 2024
застрял на этом уровне((
zabungalilovo Уровень 17
15 декабря 2024
учусь параллельно на онлайн-курсах, сейчас там пошел второй модуль после кора - веб разработка. И времени на джавараш сейчас совсем нет. Не знаю как успевать все, отстаю и там и тут. Потиху начинается депрессия.На моих курсах обучение состоит из 3 месяцев кора и 4 месяцев веба. На коре я пытался идти параллельно джаварашу, но дальше на курсах улетели вперед - очень ускоренная программа, зачастую по верхам. Исходя из этого делаю вывод, что идеальный вариант пройти джавараш за месяцев 6-7. И после этого шлифануть все это дело курсами. Либо изначально идти на курсы, которые идут от года. Если бы я мог отмотать время назад, то пошел бы на джава-университет скорее всего, там на 12 месяцев вроде как программа. А у вас как успехи?
ВК Уровень 36
16 декабря 2024
А я прошёл модули syntax и core менее чем за 3 недели (да, у меня есть бэкграунд и других языков и свободное время), но вот дальше появляется некая усталость от абстрактных задач - хочется уже делать пет-проекты, чтобы и теория устаканилась в голове, найдя полезные применения, и практика порадовала. Ну и ещё такой момент - на этом этапе у Javarush теоретический материал уже проседает (многие в комментариях начинают отмечать, что больше гуглят, чем читают, так что за они тогда платят, гуглить и бесплатно можно), а задачи становятся более трудоёмкими и кажутся оторванными от жизни (и опять же многие признают, что скипают их, не очень понимая, зачем им именно это). По этому поводу у меня некоторые сомнения, следует ли продолжать подписку - задачи я себе и сам придумаю, теорию для их решения и сам нагуглить могу... P.S. Ни в коем случае не хочу обидеть авторов JavaRush, первый модуль был чудесен и мотивационная часть была отличная и подбадривает до сих пор (я до сих пор хочу добить некоторые ачивки, хотя это совершенно иррационально). Но ближе к 30-му уровню появляется неудержимый практический зуд, который вряд-ли можно удовлетворить только курсами. P.P.S. Если это читает кто-то с уровней сильно за 30+, скажите как там? Даст Javarush там что-то, чего нельзя достичь самообразованием?
Deus Vult Уровень 32
27 декабря 2024
у меня начинается депрессия, когда я вижу сколько откликов на вакансии java по сравнению с тем же 1с, в котором я сейчас работаю. иногда в 20 раз больше.
Pyramid Head First Уровень 32
2 апреля 2025
++
{Java_Shark} Уровень 36
14 октября 2024
++
Dantes Уровень 1
15 сентября 2024
Что я здесь делаю ?👀