올바른 시작의 동시 멀티 스레드 기반

시작 방법과 실행 방법을 비교

자신이 이전에 실행을 생각 스레드를 시작할 수있는 방법을 시작하고, 두 기능이 유사하고, 한을 포함하여 많은 사람들이 학습의 과정에서 잘못 실현, 그들 가운데있는 매우 다른 의. 데모 코드를보고 :

/**
 * @author Chen
 * @Description start()和run()方法比较
 * @create 2019-11-05 22:01
 */
public class StartAndRunMethod {
    public static void main(String[] args) {
        //使用run方法
        Runnable runnable = ()-> System.out.println(Thread.currentThread().getName());
        runnable.run();

        //使用start方法
        new Thread(runnable).start();
    }
}

출력 :

main
Thread-0

우리는 볼 수 있습니다 스레드 실행 방법은 메인 쓰레드이며, 실행 방법을 시작하는 새 자식 스레드입니다.

시작 방법의 해석

우리 모두는 시작 정말 시작 방법을 실행하는 동안, 하나는 메인 쓰레드가 다른 새 자식 스레드, 두 개의 스레드를 포함한다는 것입니다 사실, 새 스레드를 시작하는 것을 알고 시작 메소드가 호출 될 때, 자식이 아닌 스레드 즉시 시작, 자식 스레드가 상태를 입력하려면 CPU뿐만 아니라 일부 리소스를 얻을 것이다, CPU는 호출을 기다립니다 . 전화를하는 경우에 관해서는,이 결정에 우리가 할 수 있지만, 결정하는 스레드 스케줄러 없습니다. 그래서 일부 느린 스레드가 방법을 시작할 수 스레드의 시작 방법보다 이후라고 움직이기 시작이 있습니다.

우리가 두 번 반복이라는 것을 할 때 시작 방법은 일어날 것인가?

예외 예외 : IllegalThreadStateException (불법 스레드 상태)가 발생합니다, 사실, 스레드가 구현하는 경우, 국가의 끝을 입력합니다, 실행 가능한 상태, 한 번에 완료가됩니다 다시 반환하지 않습니다.

다음으로 우리는 할 자세히 살펴 가지고 start()무엇을했던 결국 실행의 과정을 이해합니다.

  public synchronized void start() {
        /**
         * This method is not invoked for the main method thread or "system"
         * group threads created/set up by the VM. Any new functionality added
         * to this method in the future may have to also be added to the VM.
         *
         * A zero status value corresponds to state "NEW".
         */
        if (threadStatus != 0)
            throw new IllegalThreadStateException();

        /* Notify the group that this thread is about to be started
         * so that it can be added to the group's list of threads
         * and the group's unstarted count can be decremented. */
        group.add(this);

        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
                /* do nothing. If start0 threw a Throwable then
                  it will be passed up the call stack */
            }
        }
    }

에서는 start()최초 검사 스레드의 상태는 판단 threadStatus하는 판단 회 행하는 새로운 시작 스레드 아니라, 0이 아닌 start()슬로우 이유 이유. (기본 상태가 0 인 경우 온라인 Chenggang 명 초기화됩니다)

그런 다음이 동작을 가입 한 다음 start0의 기본 방법을 실행하는 스레드 그룹을했다.

해석 실행 방법

사실, 실행 방법은 코드의 세 줄, 비교적 간단하다 : 목표는 들어오는 인터페이스는 내용 또는 방법의 구현에 들어오는 실행의 내용을 재 작성의 실행 방법의 구현에, 비어 있지 않은 경우.

    @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }

그래서 우리는 실행 방법을 실행할 때, 그것은뿐만 아니라 우리 자신의 쓰기 일반적인 방법으로는 것이고, 그래서 콘솔이 메인 스레드에서 인쇄 할 수 있습니다.

그래서 우리는 실행 방법에 대한 간접 호출라고 직접 실행 방법을 호출 할 수 없습니다 새 스레드를 시작하고 싶지만, 방법을 시작해야합니다.

추천

출처www.cnblogs.com/chen88/p/11802279.html