자바 기본 강좌의Thread에서start()와run()의 차이 자바 다중 강좌

Thread 클래스는 start () 와 run () 방법을 포함하는데, 그것들의 차이점은 무엇입니까?이 장은 이에 대해 해답을 할 것이다.이 장의 내용은 start () 와run () 의 차이점 설명 start () 와run () 의 차이점 예시 start () 와run () 관련 원본 코드 (JDK1.7.0_40 기반)
start () 와run () 의 차이는 start () 를 설명합니다. start () 의 역할은 새로운 라인을 시작하는 것입니다. 새 라인은 상응하는 run () 방법을 실행합니다.start () 는 중복 호출될 수 없습니다.run (): run () 은 일반적인 구성원 방법과 마찬가지로 중복 호출될 수 있습니다.run () 을 단독으로 호출하면 현재 라인에서 run () 을 실행하고 새 라인을 시작하지 않습니다!
 
다음은 코드로 설명합니다.

class MyThread extends Thread{ 
    public void run(){
        ...
    }
};
MyThread mythread = new MyThread();
mythread.start () 는 새 라인을 시작하고 run () 방법을 실행합니다.mythread.run () 은 현재 라인에서 run () 방법을 직접 실행하고, run () 을 실행하기 위해 새 라인을 시작하지 않습니다.
 
start () 와run () 의 차이 예시 아래에서 간단한 예시를 통해 그들 사이의 차이를 보여 줍니다.소스 코드는 다음과 같습니다.

public synchronized void start() {
    // " ", !
    if (threadStatus != 0)
        throw new IllegalThreadStateException();

    // ThreadGroup
    group.add(this);

    boolean started = false;
    try {
        // start0()
        start0();
        // started
        started = true;
    } finally {
        try {
            if (!started) {
                group.threadStartFailed(this);
            }
        } catch (Throwable ignore) {
        }
    }
}

실행 결과:

main call mythread.run()
main is running
main call mythread.start()
mythread is running
결과 설명: (01) Thread.currentThread().getName () 은 현재 스레드를 가져오는 데 사용되는 이름입니다.현재 스레드는 cpu에서 실행 중인 스레드를 가리킨다.(02) mythread.run () 은 "주선main"에서 호출되며, 이 run () 방법은 "주선main"에서 직접 실행됩니다.(03) mythread.start () 는 "스레드 mythread"를 시작하고, "스레드 mythread"가 시작되면 run () 방법을 호출합니다.이때run () 방법은'선정 mythread'에서 실행됩니다.
 
start() 및 run() 관련 소스(JDK1.7.0_40 기반)Thread.java에서 start() 메서드의 소스 코드는 다음과 같습니다.

public synchronized void start() {
    // " ", !
    if (threadStatus != 0)
        throw new IllegalThreadStateException();

    // ThreadGroup
    group.add(this);

    boolean started = false;
    try {
        // start0()
        start0();
        // started
        started = true;
    } finally {
        try {
            if (!started) {
                group.threadStartFailed(this);
            }
        } catch (Throwable ignore) {
        }
    }
}

설명: start () 는 실제로 로컬 방법인 start0 () 을 통해 라인을 시작합니다.start0 () 은 하나의 라인을 새로 실행하고, 새 라인은run () 방법을 호출합니다.

private native void start0();
Thread.java의 run() 코드는 다음과 같습니다.

public void run() {
    if (target != null) {
        target.run();
    }
}
설명: target은 Runnable 대상이다.run()은 Thread 스레드를 직접 호출하는 Runnable 구성원의 run() 방법입니다. 새로 만들지 않습니다.

좋은 웹페이지 즐겨찾기