请解释Thread run()和start()方法的输出

Jav*_*ser 9 java multithreading

请解释以下代码的输出:

如果我打电话th1.run(),输出是:

EXTENDS RUN>>
RUNNABLE RUN>>
Run Code Online (Sandbox Code Playgroud)

如果我打电话th1.start(),输出是:

RUNNABLE RUN>>
EXTENDS RUN>>
Run Code Online (Sandbox Code Playgroud)

为什么这种不一致?请解释.

class ThreadExample extends Thread{
    public void run() {
        System.out.println("EXTENDS RUN>>");
    }
}

class ThreadExampleRunnable implements Runnable {
    public void run() {
        System.out.println("RUNNABLE RUN>>");
    }
}

class ThreadExampleMain{
    public static void main(String[] args) {
        ThreadExample th1 = new ThreadExample();
        //th1.start(); 
        th1.run();

        ThreadExampleRunnable th2 = new ThreadExampleRunnable();
        th2.run();
    }
}
Run Code Online (Sandbox Code Playgroud)

kro*_*ock 8

Thread.start()方法启动一个新线程,该线程的入口点是run()方法.如果直接调用run(),它将在同一个线程中执行.鉴于调用Thread.start()将启动一个新的执行线程,run()可以在执行主方法的其余部分之后(如在您的示例中)调用该方法.

更改主要方法以th1.start()重复调用和运行,您将看到有时输出:

EXTENDS RUN>>
RUNNABLE RUN >>
Run Code Online (Sandbox Code Playgroud)

有时输出:

RUNNABLE RUN >>
EXTENDS RUN>>
Run Code Online (Sandbox Code Playgroud)

取决于java如何选择安排2个线程.

看看关于这个的java教程.