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

时间:2019-01-25 11:30:32

标签: java java-threads

我正在尝试了解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

2 个答案:

答案 0 :(得分:1)

任何线程的执行顺序都不是确定的,这意味着它在执行过程中始终是不同的,并且不可能知道该顺序。

调试模式不变。

如果要按顺序执行它们,请按以下方式使用join方法:

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

这样,代码将等待线程号1结束,然后将其开始编号2,依此类推。

答案 1 :(得分:1)

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

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

当您start() Thread提交给Thread Scheduler时。

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

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

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