我正在尝试了解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,依此类推。
预期行为,与DEBUG
或RUN
无关。
如果你多次运行它,你会得到不同的结果。
当您start()
Thread
时,它会提交给Thread Scheduler
。
Thread Scheduler
是决定应运行哪个线程的JVM
的一部分。不能保证会选择哪个Thread
执行。Thread Scheduler
主要使用抢占式或时间切片调度来调度线程。
您可以加入所有线程,因此一个线程将等待另一个线程,但这没有意义。
多线程的所有要点都是并行/并发执行。