Thread类的join方法
join()方法,因为join()方法底层是就是通过wait()方法实现的。
让"主线程"等待(WAITING状态),一直等到其他线程不再活动为止,然后"主线程"再执行。join在英语中是“加入”的意思,join()方法要做的事就是,当有新的线程加入时,主线程会进入等待状态,一直到调用join()方法的线程执行结束为止。
1 案例一:
class A implements Runnable{
@Override
public void run() {
for (int i = 0; i < 50; i++) {
System.out.print("A"+(i+1)+"\t");
}
}
}
class B implements Runnable{
@Override
public void run() {
for (int i = 0; i < 50; i++) {
System.out.print("B"+(i+1)+"\t");
}
}
}
public class Demo03 {
public static void main(String[] args) throws InterruptedException {
Thread threadA = new Thread(new A());
Thread threadB = new Thread(new B());
threadA.start();
threadA.join();
threadB.start();
threadB.join();
for (int i = 0; i < 50; i++) {
System.out.print("m"+(i+1)+"\t");
}
}
}
join加入前的运行结果
join加入后的运行结果
对于上述案例一,主要为了对比凸显join的作用,加上join后,在对应的线程对象start后,只有该线程对象在运行,其他的都被等待了,但该方法主要针对的是“主”线程,这个“主”线程并不特指main函数。
2 案例二:
class F implements Runnable{
@Override
public void run() {
Thread thread = new Thread(new S());
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 50; i++) {
System.out.print("F"+(i+1)+"\t");
}
}
}
class S implements Runnable{
@Override
public void run() {
for (int i = 0; i < 50; i++) {
System.out.print("S"+(i+1)+"\t");
}
}
}
public class Demo04 {
public static void main(String[] args) {
new Thread(new F()).start();
}
}
案例二就是一个很好的说明,F类里添加了S类的线程对象,调用join方法后,S线程执行完毕才轮到F线程。
这是注释掉join后的运行结果
这是没有注释join的运行结果
关于更详细的解释可以去观看这篇博客
详解Java线程中的join()方法