Бесплатный курс по Java: от основ до продвинутого уровня
Корректная остановка потоков в Java с помощью Interrupt
Чтобы резко остановить поток можно использовать метод Stop(), но резко останавливать не рекомендуется, это может быть опасно.
Поэтому метод 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 vs Runnable: как возвращать результат из потока в Java. Примеры использования FutureTask для получения результатов асинхронных операций.
Time to read: 12
ExecutorService: управление пулом потоков
Изучите ExecutorService в Java для эффективного управления пулом потоков. Уменьшайте накладные расходы, переиспользуя потоки в многопоточных приложениях.
Time to read: 15
ReadWriteLock в Java
Узнайте, как ReadWriteLock в Java разделяет блокировки на чтение и запись. Оптимизируйте многопоточный доступ к ресурсам с примерами кода и объяснениями.