때로는 특정 시점에 실행 스레드를 중단해야 하는 경우도 있습니다. 예를 들어, 1분마다 한 번씩 센서 상태를 확인하는 스레드는 나머지 시간에는 아무 작업도 수행할 필요가 없습니다. 이 시간 동안 스레드는 컴퓨터 리소스를 사용할 필요가 없습니다. 이 기간이 경과한 후 JVM(Java Virtual Machine)이 스레드를 예약하면 스레드가 계속 실행됩니다. 이를 위해 Thread 클래스의 sleep() 메소드를 사용할 수 있습니다. 이 메서드는 휴면을 통해 스레드의 실행을 지연시키며, 정수형 매개변수는 휴면 시간(밀리초)을 지정합니다. sleep() 메소드가 호출되어 Sleep 시간이 끝나면 Java Virtual Machine은 스레드에 CPU 실행 시간을 할당하고 스레드는 계속 실행됩니다.
sleep() 메서드를 사용하는 또 다른 방법은 열거형 TimeUnit의 요소를 사용하는 것입니다. 이 메소드는 Thread의 sleep() 메소드를 사용하여 현재 스레드를 휴면 상태로 만듭니다. 지정된 시간 단위를 매개변수로 받아들여 해당 시간(밀리초)으로 변환할 수 있습니다.
이번 섹션에서는 sleep() 메소드를 사용하여 매초 현재 시간을 출력하는 프로그램을 개발하겠습니다.
알아요
이 섹션의 예제를 구현하려면 아래 표시된 단계를 따르세요.
1. FileClock이라는 클래스를 생성하고 Runnable 인터페이스를 구현합니다. 코드는 다음과 같습니다:
다음과 같이 코드 코드를 복사합니다.
공개 클래스 FileClock은 Runnable을 구현합니다.
2. run() 메소드를 구현하십시오. 코드는 다음과 같습니다:
다음과 같이 코드 코드를 복사합니다.
@보수
공개 무효 실행() {
3. 각 반복에서 Date 객체를 생성하고 이를 콘솔에 인쇄합니다. 그런 다음 TimeUtil의 SECONDS 속성을 통해 sleep() 메서드를 호출하여 스레드의 실행을 1초 동안 지연시킵니다. 나는 sleep() 메소드가 InterruptedException을 던질 것이라고 생각했습니다. 따라서 예외를 포착하려면 몇 줄의 코드를 더 작성해야 합니다. 스레드가 중단될 수 있는 경우 항상 스레드에 사용된 리소스를 해제하거나 닫는 것이 가장 좋습니다. 코드는 다음과 같습니다:
다음과 같이 코드 코드를 복사합니다.
for (int i = 0; i < 10; i++) {
System.out.printf("%s/n", new Date());
노력하다 {
TimeUnit.SECONDS.sleep(1);
} 잡기(InterruptedException e) {
System.out.printf("FileClock이 중단되었습니다./n");
}
}
4. 우리는 이미 잘 구현된 스레드 클래스를 가지고 있습니다. 이제 메인 클래스를 구현해 보겠습니다. FileMain이라는 클래스를 만들고 main() 메서드를 구현합니다. 코드는 다음과 같습니다:
다음과 같이 코드 코드를 복사합니다.
공개 클래스 FileMain {
공개 정적 무효 메인(String[] args) {
5. FileClock 객체를 생성한 다음 작업을 수행하기 위한 스레드를 생성합니다. 그런 다음 스레드를 시작하십시오. 코드는 다음과 같습니다:
다음과 같이 코드 코드를 복사합니다.
FileClock 시계 = 새로운 FileClock();
스레드 스레드 = 새 스레드(시계);
thread.start();
6. 메인 스레드에서 TimeUtil의 SECONDS 속성을 통해 sleep() 메서드를 호출하여 5초 동안 대기합니다. 코드는 다음과 같습니다:
다음과 같이 코드 코드를 복사합니다.
노력하다 {
TimeUnit.SECONDS.sleep(5);
} 잡기(InterruptedException e) {
e.printStackTrace();
}
7. FileClock 스레드를 중단합니다. 코드는 다음과 같습니다:
다음과 같이 코드 코드를 복사합니다.
스레드.인터럽트();
8. 예제를 실행하여 실행 효과를 확인합니다.
왜인지 알아
이 프로그램을 실행하면 프로그램이 어떻게 매초마다 날짜 개체를 인쇄하는지, 스레드가 어떻게 중단되는지 알 수 있습니다.
sleep() 메서드가 호출되면 스레드는 CPU를 떠나 일정 기간 동안 실행을 중지합니다. 이 시간 동안 스레드에는 더 이상 CPU가 필요하지 않으므로 CPU는 다른 작업을 수행할 수 있습니다.
휴면 스레드가 중단되면 휴면이 끝날 때까지 기다리지 않고 즉시 InterruptedException이 발생합니다.
끝나지 않는
Java 동시성 API에는 스레드가 CPU를 포기하도록 허용하는 또 다른 방법이 있습니다. 이 메소드를 호출하면 해당 스레드가 다른 스레드에 CPU를 양보할 수 있음을 나타내는 메시지가 Java 가상 머신에 전송됩니다. JVM(Java Virtual Machine)은 이 요청에 대한 응답을 보장하지 않습니다. 일반적으로 이 방법은 프로그램을 디버깅할 때만 사용됩니다.
교리를 사용하라
이 글은 "Java 7 Concurrency Cookbook"(D Gua Ge가 "Java7 Concurrency 예제 모음"으로 훔쳤습니다)을 번역한 것이며, 학습 자료로만 사용됩니다. 허가 없이 상업적인 목적으로 사용할 수 없습니다.
작은 성공
이 섹션에 사용된 샘플 코드의 전체 버전입니다.
FileClock 클래스의 전체 코드는 다음과 같습니다.
패키지 com.diguage.books.concurrencycookbook.chapter1.recipe5;
java.util.Date 가져오기;
import java.util.concurrent.TimeUnit;
/**
* 현재 날짜와 시간을 1초마다 콘솔에 출력합니다.
* 날짜: 2013-09-18
* 시간: 23:11
*/
공개 클래스 FileClock은 Runnable을 구현합니다.
@보수
공개 무효 실행() {
for (int i = 0; i < 10; i++) {
System.out.printf("%s/n", new Date());
노력하다 {
TimeUnit.SECONDS.sleep(1);
} 잡기(InterruptedException e) {
System.out.printf("FileClock이 중단되었습니다./n");
}
}
}
FileMain 클래스의 전체 코드
다음과 같이 코드 코드를 복사합니다.
패키지 com.diguage.books.concurrencycookbook.chapter1.recipe5;
import java.util.concurrent.TimeUnit;
/**
* 데모 스레드 잠자기 및 재개
* 날짜: 2013-09-19
* 시간: 00:29
*/
공개 클래스 FileMain {
공개 정적 무효 메인(String[] args) {
FileClock 시계 = 새로운 FileClock();
스레드 스레드 = 새 스레드(시계);
thread.start();
노력하다 {
TimeUnit.SECONDS.sleep(5);
} 잡기(InterruptedException e) {
e.printStackTrace();
}
스레드.인터럽트();
}
}