В многопоточном программировании на Java тип java.lang.Thread содержит ряд методов start(), stop(), stop(Throwable) и suspend(), Destroy() и возобновить(). С помощью этих методов мы можем выполнять удобные операции с потоками, но среди этих методов сохраняется только метод start().
Причины отказа от этих методов подробно объяснены в статье Sun «Почему Thread.stop, Thread.suspend и Thread.resume устарели?»
Если вам действительно необходимо завершить поток, вы можете использовать следующие методы:
1. Позвольте методу run() потока завершить выполнение и поток завершится естественным образом. (Этот метод является лучшим)
2. Завершите поток, опрашивая и разделяя биты флага, например, while(flag){}, начальное значение флага устанавливается в true, а когда его необходимо завершить, установите значение flag в false. (Этот метод тоже не очень хорош, потому что если метод while(flag){} заблокируется, флаг станет недействительным)
частная изменчивая логическая остановка = ложь;
общественная недействительность завершения() {
стоп = правда;
}
общественный недействительный запуск () {
пока (стоп) {
// ... некоторые утверждения
}
}
}
Если поток переходит в состояние «Не выполняется» из-за выполнения функции сна() или ожидания(), а если это функция ожидания(), то он не будет работать, если используется бит флага.
публичное окончательное недействительное ожидание (длительный тайм-аут)
выдает InterruptedException Этот метод заставляет текущий поток (назовем его T) помещать себя в набор ожидания объекта, а затем отказываться от всех требований синхронизации для этого объекта. То есть текущий поток переходит в состояние ожидания.
Стандартное использование wait()
синхронизированный (объект) {
while(<условие не выполнено>){
объект.wait();
}
Процесс обработки, удовлетворяющий условиям
}
И вы хотите это остановить, вы можете использовать третий, т.е.
3. Используйте прерывание(), и программа выдаст исключение InterruptedException, что заставит поток выполнения покинуть метод run().
Например:
общественный класс SomeThread {
public static void main(String[] args)
{
Поток потока = новый поток (новый Runnable () {
общественный недействительный запуск () {
while (!Thread.interrupted()) {
// Обрабатываем работу, которую нужно обработать
пытаться {
System.out.println("Иди спать");
Thread.sleep(1000);
} catch (InterruptedException e) {
е.printStackTrace();
System.out.println("Меня прервали!");
}
});
поток.start();
поток.прерывание();
}
}
идти спать
меня прервали!