Иногда нам нужно прервать выполняющийся поток в определенный момент времени. Например, поток, проверяющий состояние датчика раз в минуту. В остальное время потоку не нужно ничего делать. В течение этого времени потоку не нужно использовать какие-либо ресурсы компьютера. По истечении этого периода времени, когда виртуальная машина Java планирует поток, поток продолжает выполняться. Для этого вы можете использовать метод Sleep() класса Thread. Этот метод задерживает выполнение потока путем перехода в режим ожидания, а параметр целочисленного типа указывает количество миллисекунд ожидания. Когда вызывается метод Sleep() и время ожидания истекает, виртуальная машина Java выделяет потоку время работы ЦП, и поток продолжает выполняться.
Другой способ использования метода Sleep() — через элементы перечисляемого типа TimeUnit. Этот метод использует метод Sleep() потока, чтобы перевести текущий поток в спящий режим. Он может принять указанную единицу времени в качестве параметра и преобразовать ее в соответствующее количество миллисекунд.
В этом разделе мы разработаем программу, которая использует метод Sleep() для печати текущего времени каждую секунду.
знай это
Следуйте инструкциям ниже, чтобы реализовать примеры из этого раздела.
1. Создайте класс FileClock и реализуйте интерфейс Runnable. Код выглядит следующим образом:
Скопируйте код кода следующим образом:
публичный класс FileClock реализует Runnable {
2. Реализуйте метод run(). Код выглядит следующим образом:
Скопируйте код кода следующим образом:
@Override
общественный недействительный запуск () {
3. Напишите цикл, который проходит десять раз. На каждой итерации создайте объект Date и выведите его на консоль. Затем вызовите метод Sleep() через свойство SECONDS TimeUtil, чтобы задержать выполнение потока на одну секунду. Я думал, что метод Sleep() выдаст InterruptedException. Поэтому нам нужно написать еще несколько строк кода для перехвата исключений. Если поток может быть прерван, всегда рекомендуется освободить или закрыть ресурсы, используемые в потоке. Код выглядит следующим образом:
Скопируйте код кода следующим образом:
для (int я = 0; я <10; я++) {
System.out.printf("%s/n", новая дата());
пытаться {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
System.out.printf("FileClock был прерван./n");
}
}
4. У нас уже есть хорошо реализованный класс потока. Теперь давайте реализуем основной класс. Создайте класс с именем FileMain и реализуйте метод main(). Код выглядит следующим образом:
Скопируйте код кода следующим образом:
общественный класс FileMain {
public static void main(String[] args) {
5. Создайте объект FileClock, а затем создайте поток для выполнения задач. Затем запустите ветку. Код выглядит следующим образом:
Скопируйте код кода следующим образом:
Часы FileClock = новый FileClock();
Поток потока = новый поток (часы);
поток.start();
6. В основном потоке вызовите метод Sleep() через свойство SECONDS TimeUtil и подождите пять секунд. Код выглядит следующим образом:
Скопируйте код кода следующим образом:
пытаться {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
е.printStackTrace();
}
7. Прервите поток FileClock. Код выглядит следующим образом:
Скопируйте код кода следующим образом:
поток.прерывание();
8. Выполните пример и проверьте эффект выполнения.
знаю почему
Когда вы запустите эту программу, вы увидите, как программа печатает объект даты каждую секунду и как поток прерывается.
Когда вызывается метод Sleep(), поток покидает ЦП и прекращает выполнение на некоторое время. В это время потоку больше не нужен ЦП, поэтому ЦП может выполнять другие задачи.
Когда спящий поток прерывается, InterruptedException будет выброшено немедленно, а не дожидаясь окончания сна.
бесконечный
В API параллелизма Java есть еще один метод, позволяющий потокам отказываться от процессора. Это метод yield(). Вызов этого метода отправляет сообщение виртуальной машине Java, указывающее, что поток может передать процессор другим потокам. Виртуальная машина Java не гарантирует ответа на этот запрос. Обычно этот метод используется только при отладке программы.
Используйте доктрину
Эта статья переведена из «Книги по параллелизму Java 7» (Д Гуа Ге украл ее как «Коллекция примеров параллелизма Java7») и используется только в качестве учебных материалов. Его нельзя использовать в коммерческих целях без разрешения.
Небольшой успех
Полная версия примера кода, используемого в этом разделе.
Полный код класса FileClock выглядит следующим образом:
пакет com.diguage.books.concurrencycookbook.chapter1.recipe5;
импортировать java.util.Date;
импортировать java.util.concurrent.TimeUnit;
/**
* Каждую секунду распечатывайте текущую дату и время на консоль.
* Дата: 18 сентября 2013 г.
* Время: 23:11
*/
публичный класс FileClock реализует Runnable {
@Override
общественный недействительный запуск () {
для (int я = 0; я <10; я++) {
System.out.printf("%s/n", новая дата());
пытаться {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
System.out.printf("ФайлClock был прерван./n");
}
}
}
Полный код класса FileMain
Скопируйте код кода следующим образом:
пакет com.diguage.books.concurrencycookbook.chapter1.recipe5;
импортировать java.util.concurrent.TimeUnit;
/**
* Демо-поток сна и возобновления
* Дата: 19 сентября 2013 г.
* Время: 00:29
*/
общественный класс FileMain {
public static void main(String[] args) {
Часы FileClock = новый FileClock();
Поток потока = новый поток (часы);
поток.start();
пытаться {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
е.printStackTrace();
}
поток.прерывание();
}
}