Корректная остановка потоков с помощью Interrupt
Last updated: 7 мая 2025 г.Чтобы резко остановить поток можно использовать метод Stop()
, но резко останавливать не рекомендуется, это может быть опасно.
Поэтому метод 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
мин.
ExecutorService: управление пулом потоков
15
мин.
ReadWriteLock в Java
15
мин.