线程run()方法在eclipse中的Run和Debug上执行不同

Nev*_*161 2 java eclipse multithreading program-entry-point

对于下面的程序,在eclipse上运行和调试时会出现不同的输出.

 public class MyClass implements Runnable {
        public static void main (String[] args) throws Exception {
            Thread t = new Thread(new MyClass());
            t.start();
            System.out.print("Started");
            t.join();
            System.out.print("Complete");
        }
        public void run() {
            for (int i = 0; i < 4; i++) {
                System.out.print(i);
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

当作为java应用程序运行时,OUTPUT

Started0123Complete

在检查调试模式时,OUTPUT

0123StartedComplete

有人可以帮忙吗?是因为两个线程?main thread以及开头的线程t.start().如果是,那么为什么主线程执行优先于先完成?

谢谢

Gio*_*tta 6

根据定义,字符串"Started"和整数打印输出的顺序是不确定的.在您调用之后start,无法保证方法中的代码run将在调用之前出现的任何其他语句之前或之后执行join.这是多线程应用程序的本质.

您在调试模式与运行模式下看到某个输出的事实可能完全是偶然的,如果您多次运行代码或在JVM的不同平台/版本上运行您的代码可能会更改.如果在这种情况下需要确定性顺序,那么实现它的唯一方法是调用之前打印一个字符串start或引入一些其他类型的信号量来强制线程等待主线程或反之.