我正在尝试了解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
答案 0 :(得分:1)
任何线程的执行顺序都不是确定的,这意味着它在执行过程中始终是不同的,并且不可能知道该顺序。
调试模式不变。
如果要按顺序执行它们,请按以下方式使用join方法:
t1.start();
t1.join();
t2.start();
t2.join();
t3.start();
t3.join();
这样,代码将等待线程号1结束,然后将其开始编号2,依此类推。
答案 1 :(得分:1)
这是预期的行为,与DEBUG
或RUN
无关。
如果将其多次运行,将会得到不同的结果。
当您start()
Thread
提交给Thread Scheduler
时。
Thread Scheduler
是JVM
的一部分,它决定应该运行哪个线程。不能保证选择哪个Thread
来执行。 Thread Scheduler
主要使用抢占式或时间片式调度来调度线程。
您可以加入所有线程,因此一个线程将等待另一个线程,但这没有任何意义。
多线程的所有要点是并行/并发执行。