【发布时间】:2018-05-08 04:07:07
【问题描述】:
我知道何时在一个线程内调用 join 方法,然后该线程必须等到“joined Thread”终止。但是如果在调用 join() 方法之前有更多代码 - 会发生什么?我在以下代码中发布了我的代码和混淆:
class MyJoinThread extends Thread {
public static Thread myMain;
public void run() {
for(int i = 0; i< 2; i++) {
System.out.println("I am loop");
}
try {
myMain.join();
}
catch(InterruptedException ex) {
ex.printStackTrace();
}
for(int j = 0; j < 5; j++) {
System.out.println("I am "+ Thread.currentThread().getName());
}
}
}
class MyJoinMainThread {
public static void main(String [] args) {
MyJoinThread.myMain = Thread.currentThread();
MyJoinThread th = new MyJoinThread();
th.start();
for(int i = 0; i<10; i++){
System.out.println("I am " + Thread.currentThread());
}
}
}
给定的输出是:
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am loop
I am loop
I am Thread-0
I am Thread-0
I am Thread-0
I am Thread-0
I am Thread-0
为什么输出不是这样的?
I am loop
I am loop
I am Thread[main,5,main]
.....
I am Thread[main,5,main]
I am Thread-0
..
I am Thread-0
I am Thread-0
我在主线程上调用 join() 方法之前包含一个循环。为什么在主线程开始执行之前不打印这些行?因为该循环是在调用 join() 方法之前调用的。
【问题讨论】:
-
这是 system.out + err 吗? ;) ...如何加入“主线程”!??
System.exit(int);? :) ...不,说真的:你不能依赖任何之前加入,但加入之后你可以确定 main 是“完成”.. -
main() 在调用 th.start() 时不必停止;您的代码可能不是“确定性的”。阅读上下文切换
-
@AbdulAhad - Abdul Ahad - 确实,在这段代码中,哪个线程将首先启动,我们无法假设。它可能首先是主线程,也可能首先是“MyJoinThread”。但是必须发生一件事,那就是当 myMain.join() 调用时,“MyJoinThread”必须等待“主线程”的终止。
标签: java multithreading