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

标签 java multithreading

请解释以下代码的输出:

如果我调用 th1.run(),输出是:

EXTENDS RUN>>
RUNNABLE RUN>>

如果我调用 th1.start(),输出是:

RUNNABLE RUN>>
EXTENDS RUN>>

为什么会出现这种不一致?请解释。

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();
    }
}

最佳答案

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

改变你的主要方法调用th1.start()并重复运行,你会看到有时它输出:

EXTENDS RUN>>
RUNNABLE RUN >>

有时它会输出:

RUNNABLE RUN >>
EXTENDS RUN>>

取决于 java 选择如何安排您的 2 个线程。

查看 java tutorial对此。

关于java - 请解释 Thread run() 和 start() 方法的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3027495/

相关文章:

C#后台 worker ,winform。 "Cross-thread operation not valid:"

c# - 使用在主线程中创建的 COM 对象无阻塞地运行一段代码

java - 如何在Java中循环一个类属性?

java - JLabel.setBounds();在 java 代码中产生不令人满意的结果

java - 文件写入的行数有最大限制吗?

java - 每 5 分钟更新一次变量的值

objective-c - 使用 NSXPCConnection 时如何同步等待回复 block

java - 当你用小 X 关闭 GUI 时

java.io.File 在写入文件时获取额外的字符

java - XMLUnit-2 忽略某些嵌套的 XML 元素