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

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

Search Icon

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

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

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

class SomeThread extends Thread { SomeThread(String name){ super(name); } public void run(){ System.out.printf(“%s started… \n”, Thread.currentThread().getName()); int counter=1; // счетчик циклов while(!isInterrupted()){ //если возвращает true //то цикл останавливается System.out.println(“Loop ” + counter++); } //то есть получается блок while работает //пока не придет сигнал его остановить //методом interrupt и в этом вся суть System.out.printf(“%s finished… \n”, Thread.currentThread().getName()); } } public class InterruptExample { public static void main(String[] args) { System.out.println(“Main thread started…”); SomeThread t = new SomeThread(“SomeThread”); t.start(); try{ Thread.sleep(150); //до вызова interrupt метод isInterrupted //в потоке возвращает false t.interrupt();//теперь статус потока t – прерван //и теперь в потоке t вызов метода isInterrupted //должен вернуть true Thread.sleep(150); } catch(InterruptedException e){ System.out.println(“Thread has been interrupted”); } System.out.println(“Main thread finished…”); } }

Вывод:

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

Callable в Java

Callable vs Runnable: как возвращать результат из потока в Java. Примеры использования FutureTask для получения результатов асинхронных операций.
Time to read: 12

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

Изучите ExecutorService в Java для эффективного управления пулом потоков. Уменьшайте накладные расходы, переиспользуя потоки в многопоточных приложениях.
Time to read: 15

ReadWriteLock в Java

Узнайте, как ReadWriteLock в Java разделяет блокировки на чтение и запись. Оптимизируйте многопоточный доступ к ресурсам с примерами кода и объяснениями.
Time to read: 15