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



我正在尝试了解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();  
    }  
} 

当我使用调试模式时,我的输出:

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 Scheduler是决定应运行哪个线程的JVM的一部分。不能保证会选择哪个Thread执行。Thread Scheduler主要使用抢占式或时间切片调度来调度线程。

您可以加入所有线程,因此一个线程将等待另一个线程,但这没有意义。

多线程的所有要点都是并行/并发执行。

相关内容

最新更新