Java 동시 프로그래밍 예(6): 스레드 실행 종료 대기

어떤 장면에서, 우리는 반드시 라인이 완성되기를 기다려야만 다음 작업을 진행할 수 있다.예를 들어 일부 프로그램은 실행을 시작하기 전에 자원을 초기화해야 한다.이때, 우리는 초기화 임무를 하기 위해 라인을 가동할 수 있으며, 라인 임무가 완성된 후에 다른 부분을 집행할 수 있다.
이를 위해, Thread 클래스는 join () 방법을 제공합니다.우리가 루틴 대상을 사용하여 이 방법을 호출할 때, 호출 중인 루틴 대상은 호출 대상이 실행된 후에 실행을 시작할 때까지 연기됩니다.
이 절에서 예시 프로그램은 초기화 방법이 완성되기를 기다린 후에 다른 작업을 수행하는 것을 보여 준다.
그 사실을 알다
아래와 같은 절차에 따라 예시 절차를 완성하다.
1. DataSourcesLoader라는 클래스를 만들고 Runnable 인터페이스를 실현합니다.코드는 다음과 같습니다.

public class DataSourcesLoader implements Runnable {
2.run() 방법을 실현하여 컨트롤러에 실행 시작을 설명하고 4초 동안 잠을 자고 컨트롤러에 실행 완료를 설명하기 위해 정보를 출력합니다.코드는 다음과 같습니다.

@Override
public void run() {
    System.out.printf("Beginning data sources loading: %s
",
            new Date());
    try {
        TimeUnit.SECONDS.sleep(4);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    System.out.printf("Data sources loading has finished: %s
",
            new Date());
}

3. NetworkConnectionsLoader라는 클래스를 만들고 Runnable 인터페이스를 실현합니다.run() 방법을 실현합니다. 이 방법 코드는 DataSourcesLoader 클래스의run() 방법과 같습니다. 단지 이 수면 6초입니다.
4. 예시된 메인 클래스를 실현하고main () 방법을 실현한다.코드는 다음과 같습니다.

public class Main {
    public static void main(String[] args) {
5. DataSourcesLoader 객체와 실행을 시작하는 Thread 객체를 만듭니다.코드는 다음과 같습니다.

DataSourcesLoader dsLoader = new DataSourcesLoader();
Thread thread1 = new Thread(dsLoader, "DataSourcesLoader");
6. NetworkConnectionsLoader 객체와 실행을 시작하는 Thread 객체를 만듭니다.코드는 다음과 같습니다.

NetworkConnectionsLoader ncLoader = new NetworkConnectionsLoader();
Thread thread2 = new Thread(ncLoader, "NetworkConnectionsLoader");
7. 두 Thread 객체의 start() 메서드를 호출합니다.코드는 다음과 같습니다.

thread1.start();
thread2.start();
8. join () 방법을 호출하여 두 라인이 임무를 완성하기를 기다립니다.이 방법은 Interrupted Exception 이상을 던지기 때문에 이 이상을 포착해야 합니다.코드는 다음과 같습니다.

try {
    thread1.join();
    thread2.join();
} catch (InterruptedException e) {
    e.printStackTrace();
}
9. 컨트롤러에 한 마디를 인쇄하면 프로그램 실행이 끝났다는 것을 나타낸다.코드는 다음과 같습니다.

System.out.printf("Main: Configuration has been loaded: %s
",
        new Date());
10. 실행 프로그램을 실행하여 실행 효과를 보십시오.
그 까닭을 알다
이 예시 프로그램을 실행할 때, 우리는 두 개의 라인이 그것들의 실행을 시작하는 것을 볼 수 있다.먼저 DataSourcesLoader가 수행합니다.그리고 NetworkConnectionsLoader가 실행을 완료했습니다.이 때, 메인 루틴은 실행을 계속하고, 컨트롤러에 종료 정보를 출력합니다.
영원히 끝이 없다
Java는 다음과 같은 두 가지 재부팅 방법을 제공합니다.

join(long milliseconds)
join(long milliseconds, long nanos)
첫 번째 방식은 작업이 완료될 때까지 호출되지 않고 파라미터가 지정한 시간을 기다린 후에 실행됩니다.예를 들어,thread1이 이 방법을 호출한다면,thread1.join(1000),thread1 스레드가 다음 중 하나를 충족하면 계속 실행됩니다.
1.thread2 실행 완료하기;
2.1000밀리초 후;
이 두 조건 중 하나가 진실일 때,join () 방법은 되돌아와 원래의 임무를 계속 수행하기 시작합니다.
두 번째 방식의 방법은 첫 번째 방식과 매우 유사하지만 단지 나초급의 시간 매개 변수가 하나 더 생겼을 뿐이다.
나래주의
본고는 《Java7 Concurrency Cookbook》(D 오이고에서 《Java7 병발 예시집》으로 번역)에서 번역한 것으로 학습 자료로만 사용된다.권한이 없으면 어떠한 상업 행위에도 사용할 수 없다.
소소하다
이 절에서 사용한 예시 코드의 전체 버전.
DataSourcesLoader 클래스의 전체 코드

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

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

/**
 * Date: 2013-09-19
 * Time: 09:15
 */
public class DataSourcesLoader implements Runnable {
    @Override
    public void run() {
        System.out.printf("Beginning data sources loading: %s
",
                new Date());
        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.printf("Data sources loading has finished: %s
",
                new Date());
    }
}

NetworkConnectionsLoader 클래스의 전체 코드

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

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

/**
 * Date: 2013-09-19
 * Time: 09:21
 */
public class NetworkConnectionsLoader implements Runnable {
    @Override
    public void run() {
        System.out.printf("Beginning data sources loading: %s
",
                new Date());
        try {
            TimeUnit.SECONDS.sleep(6);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.printf("Data sources loading has finished: %s
",
                new Date());
    }
}

Main 클래스의 전체 코드

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

import java.util.Date;

/**
 * Date: 2013-09-19
 * Time: 09:25
 */
public class Main {
    public static void main(String[] args) {
        DataSourcesLoader dsLoader = new DataSourcesLoader();
        Thread thread1 = new Thread(dsLoader, "DataSourcesLoader");

        NetworkConnectionsLoader ncLoader = new NetworkConnectionsLoader();
        Thread thread2 = new Thread(ncLoader, "NetworkConnectionsLoader");

        thread1.start();
        thread2.start();

        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.printf("Main: Configuration has been loaded: %s
",
                new Date());
    }
}

좋은 웹페이지 즐겨찾기