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