我是并发领域的初学者,今天我在join()方法中做了一些练习。 代码是:
public class ThreadJoinExample {
public static void main(String[] args) {
Thread t1 = new Thread(new MyRunnable(), "t1");
Thread t2 = new Thread(new MyRunnable(), "t2");
Thread t3 = new Thread(new MyRunnable(), "t3");
t1.start();
try {
t1.join(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t2.start();
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
t3.start();
try {
t1.join();
t2.join();
t3.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Thread started:::"
+ Thread.currentThread().getName());
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out
.println("Thread ended:::" + Thread.currentThread().getName());
}
和questinon,例如,当" t1.start()",我认为t1将立即调用run()方法,但它不是真的;当" t1时。 join()",t1将调用run()方法, 我不知道造成它的原因。我的问题是: 1.当我调用start()方法时会发生什么? 2.当线程t调用start()方法时,线程t是否会被推入主memroy中的就绪队列?
答案 0 :(得分:1)
1。当我调用start()方法时会发生什么?
当你调用start方法时,它就准备好执行你的线程了。它可能是也可能不是立即的,并且取决于调度程序何时调度您的线程,然后jvm将运行您的run方法。
<强> 2。当线程t调用start()方法时,线程t是否会被推入主存储器中的就绪队列?
是的,这是对的。它可能会也可能不会立即开始执行您的线程。你可以尝试使用main方法启动你的线程,你的主线程可能会在你的线程尚未开始时完成执行。
答案 1 :(得分:1)
- 当我调用start()方法时会发生什么?
醇>
调用start()告诉线程创建必要的系统 资源然后异步执行run()方法。
- 当线程t调用start()方法时,线程t是否会被推入主内存中的就绪队列?
醇>
是。 start()方法告诉Java虚拟机它需要它 创建系统特定的线程。创建系统后 资源,它将Runnable对象传递给它以执行其run() 方法