Java 병렬 프로그래밍 예시 (5): 스레드 휴면 및 복구

때때로, 우리는 지정된 시간에 실행 중인 라인을 중단해야 한다.예를 들어 1분에 한 번씩 센서 상태의 라인을 검사하고 나머지 시간에는 아무 일도 할 필요가 없다.이 기간 동안, 라인은 컴퓨터의 어떤 자원도 사용할 필요가 없다.이 시간이 지난 후에 자바 가상 머신이 이 라인을 스케줄링하면 이 라인은 계속 실행됩니다.이를 위해, Thread 클래스의 sleeep () 방법을 사용할 수 있습니다.이 방법은 휴면 방식으로 라인의 실행을 늦추고, 정수 유형의 매개 변수는 휴면의 밀리초를 가리킨다.sleep () 방법을 호출하면 휴면 시간이 끝난 후 자바 가상 머신이 스레드 CPU 실행 시간에 분배되면 스레드가 계속 실행됩니다.
다른 하나는 sleep () 방법으로 매거 유형 TimeUnit의 요소를 통과하는 것이다.이 방식은 현재 라인을 휴면시키기 위해 Thread의 sleep () 방법을 사용합니다. 지정한 단위의 시간을 매개 변수로 받아들여 대응하는 밀리초로 변환할 수 있습니다.
이 절에서, 우리는sleep () 방법을 사용하여 1초에 한 번씩 현재 시간을 인쇄하는 프로그램을 개발할 것이다.
그 사실을 알다
아래와 같은 절차에 따라 이 절의 예시를 실현한다.
1. FileClock이라는 클래스를 만들고 Runnable 인터페이스를 실현합니다.코드는 다음과 같습니다.

public class FileClock implements Runnable {
2.run() 방법을 실현한다.코드는 다음과 같습니다.

@Override
public void run() {
3. 열 번 반복하는 순환을 쓰고 매번 교체할 때 Date 대상을 만들고 컨트롤러에 출력합니다.그리고 TimeUtil의 SECONDS 속성을 통해 sleep () 방법을 호출하여 1초의 실행 라인을 지연시킵니다.sleep () 메서드가 Interrupted Exception 이상을 내보낼 줄 알았습니다.그래서 우리는 이상을 포착하기 위해 몇 줄의 코드를 더 써야 한다.루틴이 중단될 수 있다면, 루틴에 사용되는 자원을 방출하거나 닫는 것이 최선의 실천이다.코드는 다음과 같습니다.

for (int i = 0; i < 10; i++) {
    System.out.printf("%s
", new Date());
    try {
        TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
        System.out.printf("The FileClock has been interrupted.
");
    }
}
4. 우리는 이미 실현된 루틴 종류가 있다.이제 우리는 주류를 실현한다.FileMain이라는 클래스를 만들고 main () 방법을 실현합니다.코드는 다음과 같습니다.

public class FileMain {
    public static void main(String[] args) {
5. FileClock 객체를 만들고 작업을 수행할 스레드를 생성합니다.그리고 라인을 시작합니다.코드는 다음과 같습니다.

FileClock clock = new FileClock();
Thread thread = new Thread(clock);
thread.start();
6. 메인 라인에서 TimeUtil의 SECONDS 속성을 통해 sleep () 방법을 호출하여 5초를 기다립니다.코드는 다음과 같습니다.

try {
    TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
    e.printStackTrace();
}
7. FileClock 스레드를 중단합니다.코드는 다음과 같습니다.

thread.interrupt();
8. 실행 예시, 실행 효과 보기.
그 까닭을 알다
이 프로그램을 실행할 때, 프로그램이 어떻게 1초에 한 번씩 날짜 대상을 인쇄하고, 라인이 중단되는 상황을 발견할 수 있습니다.
sleep () 방법을 호출할 때, 라인은 CPU를 떠나서 한동안 실행을 중지합니다.이 기간 동안 라인은 CPU가 필요하지 않기 때문에 CPU는 다른 작업을 수행할 수 있다.
휴면 중인 라인이 중단되면 휴면이 끝날 때까지 기다리지 않고 인터럽트 Exception을 즉시 던집니다.
영원히 끝이 없다
Java 병렬 API에는 스레드를 CPU에 양보할 수 있는 또 다른 방법이 있습니다.이것이 바로 yield() 방법이다. 이 방법을 호출하는 것은 자바 가상 컴퓨터가 메시지를 보내서 CPU를 다른 라인에 양보할 수 있다는 것을 설명하는 것이다.Java 가상 시스템은 이 요청에 응답하지 않습니다.일반적인 상황에서 이 방법은 디버깅 프로그램에서만 사용된다.
나래주의
본고는 《Java7 Concurrency Cookbook》(D 오이고에서 《Java7 병발 예시집》으로 번역)에서 번역한 것으로 학습 자료로만 사용된다.권한이 없으면 어떠한 상업 행위에도 사용할 수 없다.
소소하다
이 절에서 사용하는 예시 코드의 전체 버전입니다.
FileClock 클래스의 전체 코드

package com.diguage.books.concurrencycookbook.chapter1.recipe5;

import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * 。
 * Date: 2013-09-18
 * Time: 23:11
 */
public class FileClock implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.printf("%s
", new Date());
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                System.out.printf("The FileClock has been interrupted.
");
            }
        }
    }

FileMain 클래스의 전체 코드

package com.diguage.books.concurrencycookbook.chapter1.recipe5;

import java.util.concurrent.TimeUnit;

/**
 *
 * Date: 2013-09-19
 * Time: 00:29
 */
public class FileMain {
    public static void main(String[] args) {
        FileClock clock = new FileClock();
        Thread thread = new Thread(clock);
        thread.start();

        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        thread.interrupt();
    }
}

좋은 웹페이지 즐겨찾기