В многопоточной программе Java вся программа не завершится, пока все потоки не завершат выполнение. (Следует отметить, что выполнение всех потоков, не являющихся демонами, завершается; если поток выполняет метод System.exit(), программа также завершится.) Иногда требуется прервать выполнение потока, например: если вы хотите выйти из программы или отменить выполняемую задачу и т. д.
Java предоставляет механизм прерываний, который позволяет нам явно прервать поток, выполнение которого мы хотим прекратить. Одной из особенностей механизма прерываний является то, что мы можем проверить, был ли поток прерван, а затем решить, отвечать ли на запрос на прерывание. Поток также может игнорировать запрос на прерывание и продолжить выполнение.
В этом разделе разработанный нами пример программы создаст поток и через пять секунд использует механизм прерываний для принудительного завершения потока.
знай это
Следуйте инструкциям ниже, чтобы завершить пример программы.
1. Создайте класс PrimeGenerator и унаследуйте класс Thread. Код выглядит следующим образом:
Скопируйте код кода следующим образом:
публичный класс PrimeGenerator расширяет поток {
2. Перепишите метод run() и добавьте в него бесконечный цикл. Внутри цикла проверьте, являются ли последовательные положительные целые числа, начиная с 1, простыми числами. Если да, выведите на консоль. Код выглядит следующим образом:
Скопируйте код кода следующим образом:
@Override
общественный недействительный запуск () {
длинное число = 1л;
в то время как (истина) {
если (isPrime(число)) {
System.out.printf("Число %d /tis Prime.", Number);
}
3. После обработки числа проверьте, не был ли поток прерван, вызвав метод isInterrupted(). Если этот метод возвращает true, предложение выводится на консоль, а затем выполнение потока завершается. Код выглядит следующим образом:
Скопируйте код кода следующим образом:
если (isInterrupted()) {
System.out.println("Первичный генератор прерван");
возвращаться;
}
число++;
}
}
4. Реализуйте метод isPrime(), который используется для определения того, является ли параметр простым числом. Если да, он возвращает true, в противном случае — false. Код выглядит следующим образом:
Скопируйте код кода следующим образом:
/**
* Определить, является ли параметр простым числом
*
* @param номер Число, по которому будет оцениваться
* @возвращаться
*/
частное логическое значение isPrime(длинное число) {
если (число <= 2) {
вернуть истину;
}
for (int я = 2; я <число; я++) {
если ((число % i) == 0) {
вернуть ложь;
}
}
вернуть истину;
}
5. Теперь реализуйте основной класс примера программы, класс Main и метод main(). Код выглядит следующим образом:
Скопируйте код кода следующим образом:
общественный класс Main {
public static void main(String[] args) {
6. Создайте объект PrimeGenerator и запустите поток. Код выглядит следующим образом:
Скопируйте код кода следующим образом:
Задача потока = новый PrimeGenerator();
задача.старт();
7. Подождите пять секунд, а затем завершите поток. Код выглядит следующим образом:
Скопируйте код кода следующим образом:
пытаться {
TimeUnit.SECONDS.sleep(5L);
} catch (InterruptedException e) {
е.printStackTrace();
}
задача.прерывание();
8. Запустите пример и просмотрите результаты.
знаю почему
Ниже приведен напечатанный фрагмент примера выполнения программы. Из напечатанных символов мы можем видеть, как поток PrimeGenerator печатает информацию и как прекратить его выполнение, когда он обнаруживает, что поток прерван.
Скопируйте код кода следующим образом:
Число 43063 — простое.
Число 43067 — простое.
Число 43093 — простое.
Число 43103 — простое.
Число 43117 — простое.
Основной генератор был прерван
Thread имеет логическую функцию, указывающую, был ли поток прерван. Когда вызывается метод прерывания(), ему присваивается значение true. Метод isInterrupted() возвращает текущее значение свойства.
бесконечный
В потоке также есть метод проверки того, прерван ли поток: статический метод прерывания(), который может проверить, прерван ли текущий выполняющийся поток.
Скопируйте код кода следующим образом:
Существует большая разница между методом isInterrupted() и методом прерывания(). Первый не изменит значение свойства прерывания потока, а второй может установить значение false; Прерванный() — статический метод; для повседневной разработки рекомендуется использовать метод isInterrupted().
Как упоминалось ранее, поток может игнорировать запрос на прерывание и продолжить выполнение. Однако это не тот результат, который нам нужен.
Используйте доктрину
Эта статья переведена из «Книги по параллелизму Java 7» (Д Гуа Ге украл ее как «Коллекция примеров параллелизма Java7») и используется только в качестве учебных материалов. Его нельзя использовать в коммерческих целях без разрешения.
Небольшой успех
Полная версия всего кода, используемого в примере программы.
Полный код класса PrimeGenerator выглядит следующим образом:
пакет com.diguage.books.concurrencycookbook.chapter1.recipe3;
/**
* Дата: 18 сентября 2013 г.
* Время: 11:53
*/
публичный класс PrimeGenerator расширяет поток {
@Override
общественный недействительный запуск () {
длинное число = 1л;
в то время как (истина) {
если (isPrime(число)) {
System.out.printf("Число %d /tis Prime./n", число);
}
если (isInterrupted()) {
System.out.println("Первичный генератор прерван");
возвращаться;
}
число++;
}
}
/**
* Определить, является ли параметр простым числом
*
* @param number Число, по которому будет оцениваться
* @возвращаться
*/
частное логическое значение isPrime(длинное число) {
если (число <= 2) {
вернуть истину;
}
for (int я = 2; я <число; я++) {
if ((число % i) == 0) {
вернуть ложь;
}
}
вернуть истину;
}
}
Полный код основного класса
Скопируйте код кода следующим образом:
пакет com.diguage.books.concurrencycookbook.chapter1.recipe3;
импортировать java.util.concurrent.TimeUnit;
/**
* Дата: 18 сентября 2013 г.
* Время: 12:33
*/
общественный класс Main {
public static void main(String[] args) {
Задача потока = новый PrimeGenerator();
задача.старт();
пытаться {
TimeUnit.SECONDS.sleep(5L);
} catch (InterruptedException e) {
е.printStackTrace();
}
задача.прерывание();
}
}