对join()的调用保证使当前线程在其加入的线程之前停止执行 (换句话说,它调用join()on的线程)完成。
但是,在我的程序中,两个线程同时执行。 Thread1没有等待Thread2完成执行。
我的计划有什么问题?
public class Launcher1 {
public static void main(String[] args) {
JoinExample runnable=new JoinExample();
Thread thread1=new Thread(runnable);
Thread thread2=new Thread(runnable);
thread1.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
thread2.start();
try {
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class JoinExample implements Runnable{
public void run(){
for(int i=0;i<10;i++){
System.out.println("i:"+i+" "+Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
输出:
i:0 Thread-0
i:1个Thread-0
i:0 Thread-1
i:2 Thread-0
i:1 Thread-1
i:3 Thread-0
i:4 Thread-0
i:2 Thread-1
i:3 Thread-1
i:5 Thread-0
i:4 Thread-1
i:6 Thread-0
i:7 Thread-0
i:5 Thread-1
i:8 Thread-0
i:6 Thread-1
i:7 Thread-1
i:9 Thread-0
i:8 Thread-1
i:9 Thread-1
答案 0 :(得分:6)
但是,在我的程序中,两个线程都在同时执行。 Thread1没有等待Thread2完成执行。
不,而且它不会 - 因为第1个帖子没有调用join
。看看你再次引用的文档:
调用join()保证导致当前线程停止执行,直到它加入的线程
换句话说:join()
方法一直没有完成,直到它被调用的主题完成为止。
您的程序中有三个主题 - 两个正在运行JoinExample.run
,而#34;主要&#34;启动另外两个的线程。您告诉主线程等待线程2完成,但这就是全部。你的两个JoinExample
线程是完全独立的。
答案 1 :(得分:1)
这里有三个问题。
第一个线程 - 主线程,它运行main方法并生成2个子线程。
第二个帖子 - thread1
第3个帖子 - thread2
当您说thread2.join()
时,主线程将会阻止,直到thread2
完成,thread1
和thread2
将继续运行。