Топ-100Корректная остановка потоков с помощью Interrupt - CodOrbits
LogoCodOrbits

Раздел: Многопоточность

В этом разделе вы узнаете, как использовать многопоточность в Java для повышения производительности и параллельной обработки.

Все разделы
Иконка Многопоточность

Корректная остановка потоков с помощью Interrupt

Last updated: 7 мая 2025 г.

Чтобы резко остановить поток можно использовать метод Stop(), но резко останавливать не рекомендуется, это может быть опасно.

Search Icon

Поэтому метод Stop предан Строжайшей Анафеме ))) и использовать его можно только в самом-самом крайнем случае, например, когда поток полностью завис и когда другого варианта его остановить нету.

Используют более аккуратный способ interrupt() – этот метод не останавливает поток, а устанавливает статус потока, как прерван, но САМ ПОТОК НЕ ОСТАНАВЛИВАЕТСЯ. Статус потока теперь можно будет проверить в этом потоке в нужном нам месте с помощью метода isInterrupted() и исходя из того, что он вернет завершить выполнение каких-то действий.

Пример программы:

1class SomeThread extends Thread {
2
3    SomeThread(String name){
4        super(name);
5    }
6
7    public void run(){
8        System.out.printf("%s started… \n",
9            Thread.currentThread().getName());
10        int counter=1; // счетчик циклов
11        while(!isInterrupted()){ //если возвращает true
12        //то цикл останавливается
13            System.out.println("Loop " + counter++);
14        }
15        //то есть получается блок while работает
16        //пока не придет сигнал его остановить
17        //методом interrupt и в этом вся суть
18        System.out.printf("%s finished… \n",
19            Thread.currentThread().getName());
20    }
21}
22
23public class InterruptExample {
24
25    public static void main(String[] args) {
26        System.out.println("Main thread started…");
27        SomeThread t = new SomeThread("SomeThread");
28        t.start();
29        try{
30            Thread.sleep(150);
31            //до вызова interrupt метод isInterrupted
32            //в потоке возвращает false
33            t.interrupt();//теперь статус потока t – прерван
34            //и теперь в потоке t вызов метода isInterrupted
35            //должен вернуть true
36            Thread.sleep(150);
37        }
38        catch(InterruptedException e){
39            System.out.println("Thread has been interrupted");
40        }
41        System.out.println("Main thread finished…");
42    }
43}

Вывод:

Из консоли видно, что цикл выполнялся в потоке пока он не получил статус прерван из main.


Следующие уроки

Callable в Java

12
мин.

Similar Articles Icon
Divider

ExecutorService: управление пулом потоков

15
мин.

Similar Articles Icon
Divider

ReadWriteLock в Java

15
мин.

Similar Articles Icon