为什么在 println() 之前不调用 start() 方法?

Why start() method is not called before println()?

我正在尝试了解 join() 方法。在我的代码中,当我使用 DEBUG 模式时,它首先调用 run() 方法,但是当我使用 运行 时,我的输出不同。当我们尝试使用 start() 方法启动线程时,run() 方法将在内部调用并执行。但在我的输出中它有所不同。谁能给我一个解决方案?

class JoinExample extends Thread{  
    public void run(){  
        System.out.println("CurrentThread:"+
                           Thread.currentThread().getName());
        System.out.println("Is Alive?"+ 
                           Thread.currentThread().isAlive());

    }  
    public static void main(String args[]){  

        JoinExample t1=new JoinExample();  
        JoinExample t2=new JoinExample();  
        JoinExample t3=new JoinExample();

        t1.start();  

        System.out.println("Is Alive?" + 
                           t1.isAlive());
        t2.start();  
        t3.start();  
    }  
} 

我使用 DEBUG 模式时的输出:

Current Thread:Thread-0
Is Alive?true
Is Alive?false
Current Thread:Thread-1
Is Alive?true
Current Thread:Thread-2
Is Alive?true

当我 运行 我的代码时我的输出:

Is Alive?true
Current Thread:Thread-1
Is Alive?true
Current Thread:Thread-0
Current Thread:Thread-2
Is Alive?true
Is Alive?true

任何线程的执行顺序都不是确定性的,这意味着它总是会随着执行的不同而变化,并且不可能知道顺序。

调试模式不会改变任何东西。

如果你想让它们按顺序执行,可以这样使用join方法:

 t1.start();  
 t1.join();
 t2.start();  
 t2.join();
 t3.start();
 t3.join(); 

这样代码将等待 1 号线程完成,然后启动 2 号线程,依此类推。

这是预期的行为,与 DEBUGRUN 无关。

如果你 运行 多次,你会得到不同的结果。

当你 start() 一个 Thread 它提交给 Thread Scheduler.

Thread SchedulerJVM 的一部分,它决定哪个线程应该 运行。无法保证将选择哪个 Thread 来执行。 Thread Scheduler主要采用抢占式或时间片式调度来调度线程。

你可以加入所有的线程,所以一个会等待另一个,但这没有意义。

多线程的全部意义在于parallel/concurrent执行。