Java 동시 프로그래밍 예(一): 스레드 생성 및 실행

단도직입적으로 말하다
IT계에서, 우리가 병렬에 대해 이야기할 때마다 반드시 한 대의 컴퓨터에서 동시에 실행되는 일련의 라인을 말할 것이다.만약 이 컴퓨터에 여러 개의 프로세서가 있거나 한 개의 다핵 프로세서가 있다면, 이때는 실제적인'동시 운행'이다.그러나 컴퓨터에 단일 코어 프로세서가 하나만 있다면, 이때의'동시 실행'은 단지 표상일 뿐이다.
모든 현대 운영체제는 임무의 병행 실행을 지원한다.너는 음악을 들으면서 인터넷으로 뉴스를 볼 수 있고, 아직 첫 번째 이메일을 지체하지 않아도 된다.우리는 이런 합병이 프로세스 단계의 합병이라고 말할 수 있다.프로세스 내부에서 나도 많은 병행 임무를 볼 수 있다.우리는 하나의 프로세스에서 실행되는 병렬 작업을 라인이라고 부른다.
병발과 관련된 또 다른 흔한 개념은 병행이다.병발과 병행 사이에는 약간의 차이도 있고 약간의 관계도 존재한다.일부 프로그래머(Author,'프로그래머'로 도용)는 단일 핵 프로세서에서 여러 라인으로 응용 프로그램을 실행하는 것이 병발이며, 프로그래머의 실행을 관찰할 수 있다고 생각한다.또한 프로그램이 여러 프로세서나 멀티코어 프로세서에서 다중 스레드 형식으로 실행될 때 병행됩니다.또 일부 프로그래머들은 응용 프로그램의 라인이 미리 설정된 순서에 따라 실행되지 않으면 병발이라고 생각한다.문제 해결 방안을 간소화하기 위해 하나의 라인을 사용하고 이 라인들은 일정한 순서에 따라 집행된다면 이것은 병행이다.
이 장에서는 Java7 API를 사용하여 기본적인 스레드 작업을 수행하는 방법을 보여 줍니다.자바 프로그램에서 어떻게 라인을 만들고 실행하는지, 어떻게 라인의 실행을 제어하는지, 어떻게 하나의 라인을 하나의 단원으로 조종하는지 등을 볼 수 있을 것이다.
이 절에서는 Java 프로그램에서 스레드를 만드는 방법과 실행하는 방법을 배울 것입니다.Java 프로그램에서 모든 것이 Object이고 스레드도 마찬가지입니다.스레드를 생성하는 방법은 두 가지입니다.
1. Thread 클래스를 계승하고 run() 방법을 다시 쓰기;
2. 클래스를 만들고 Runnable 인터페이스를 실현하고Thread 클래스의 대상을 만들고 Runnable 인터페이스를 실현하는 클래스의 실례를 매개 변수로 삼아Thread 클래스의 실례를 전달한다.
이 절에서, 우리는 두 번째 방식을 사용하여 10개의 라인을 만들고 운행할 것이다.각 루틴은 두 개의 10 이내의 정수의 적을 계산하고 인쇄한다.
그 사실을 알다
다음 절차에 따라 이 예제를 실현합니다.
1. Calculator라는 클래스를 만들고 Runnable 인터페이스를 실현합니다.코드는 다음과 같습니다.

public class Calculator implements Runnable {
2. 개인 성형 속성을 성명합니다. 이름은number이고 이 유형의 구조 함수를 실현하여 방금 성명한 속성을 초기화합니다.코드는 다음과 같습니다.

private int number;

public Calculator(int number) {
    this.number = number;
}

3. run () 방법을 실현합니다. 이 방법은 우리가 만든 루틴이 실행될 때 실행되는 프로그램 (instruction) 이기 때문에 이 방법은 곱셈표를 계산하는 데 사용됩니다.구체적인 코드는 다음과 같습니다.

@Override
public void run() {
    for (int i = 0; i < 10; i++) {
        System.out.printf("%s: %d * %d = %d
",
                Thread.currentThread().getName(),
                number, i, i * number);
    }
}
4. 이제 예시 응용의 메인 클래스(main class)를 실현할 때가 되었다.ain이라는 클래스를 만들고 이 클래스에main 방법을 추가합니다.코드는 다음과 같습니다.

public class Main {
    public static void main(String[] args) {
5. main () 방법 내부에서 열 번 반복하는 for 순환을 만들고 순환 체내에서 Calculator 클래스의 대상인calculator를 만들고,Thread 클래스의 대상인thread를 만들고,calculator를 구조 함수의 매개 변수로thread의 초기화 문장에 전달합니다.마지막으로thread 대상의 start () 방법을 호출합니다.코드는 다음과 같습니다.

for (int i = 0; i < 10; i++) {
    Calculator calculator = new Calculator(i);
    Thread thread = new Thread(calculator);
    thread.start();
}
6. 이 프로그램을 실행하고 서로 다른 라인이 어떻게 병렬적으로 실행되는지 보십시오.
그 까닭을 알다
다음은 프로그램을 실행할 때, 컨트롤러가 출력한 출력입니다. 우리가 만든 모든 라인이 동시에 실행되는 것을 볼 수 있습니다.

Thread-3: 3 * 5 = 15
Thread-0: 0 * 2 = 0
Thread-3: 3 * 6 = 18
Thread-1: 1 * 6 = 6
Thread-1: 1 * 7 = 7
Thread-3: 3 * 7 = 21
Thread-3: 3 * 8 = 24
Thread-0: 0 * 3 = 0
Thread-0: 0 * 4 = 0
Thread-3: 3 * 9 = 27
Thread-1: 1 * 8 = 8
모든 Java 프로그램은 최소 하나의 스레드를 실행합니다.우리가 Java 프로그램을 실행할 때, Java 가상 머신 (나중에 JVM) 은main () 방법을 포함하는 프로그램을 호출하는 라인을 실행합니다.
Thread 객체의 start () 메서드를 호출하면 다른 스레드가 생성됩니다.start () 방법을 몇 번 호출하면 몇 개의 라인을 만들 수 있습니다.
모든 스레드가 완료되면 Java 프로그램이 종료됩니다.(비특수한 경우, 모든 비백그라운드 (non-daemon) 라인이 완성됨) 시작 라인 (예를 들어main () 방법을 실행하는 라인) 이 종료되면, 나머지 라인은 계산 작업이 끝날 때까지 계속 실행됩니다.그 중 하나가 시스템을 호출할 때.exit(), JVM 중지를 요청하면 모든 스레드가 실행을 중지합니다.
Thread 대상의run() 방법을 호출할 때 스레드가 생성되지 않습니다.마찬가지로 Runnable 인터페이스를 실현하는 클래스run() 방법을 호출할 때도 라인을 만들지 않습니다.스레드는 Thread 객체의 start () 메서드를 호출할 때만 생성됩니다.
영원히 끝이 없다
이 절에서 말한 바와 같이 스레드를 만드는 또 다른 방법이 있습니다. Thread 클래스를 계승하고run () 방법을 다시 쓰면 Thread 하위 클래스의 대상을 만들고 이 대상의 start () 방법을 호출해서 스레드를 만들 수 있습니다.

, Java , 《Java 7 Concurrency Cookbook》, , , 。 , , 。 , , 《Java7 》。
나래주의
본고는 《Java7 Concurrency Cookbook》(D 오이고에서 《Java7 병발 예시집》으로 번역)에서 번역한 것으로 학습 자료로만 사용된다.권한이 없으면 어떠한 상업 행위에도 사용할 수 없다.
소소하다
원서에 완전한 코드가 없어서 보기에 불리하다.그래서 D과형은 이 절에서 보여준 전체 코드를 전문적으로 보여주는 작은 절을 추가했다.
Calculator 클래스의 전체 코드

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

/**
 * Date: 2013-09-13
 * Time: 21:42
 */
public class Calculator implements Runnable {
    private int number;

    public Calculator(int number) {
        this.number = number;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.printf("%s: %d * %d = %d
",
                    Thread.currentThread().getName(),
                    number, i, i * number);
        }
    }
}

Main 클래스의 전체 코드

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

/**
 * Date: 2013-09-13
 * Time: 19:46
 */
public class Main {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            Calculator calculator = new Calculator(i);
            Thread thread = new Thread(calculator);
            thread.start();
        }
    }
}

좋은 웹페이지 즐겨찾기