为什么要用join()方法 在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后再结束,这个时候就要用到join()方法了。
join 会阻塞当前线程,会强制完其自己的线程后,再释放当前线程的阻塞。 但是它并不阻塞其他线程。
扩展:sleep 也是阻塞当前线程
如: 多线程 输出ABC
public class Demo2 {
public static void main(String[] args) {
Demo2 demo2=new Demo2();
demo2.t();
}
public void t(){
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
System.out.println("A");
}
});
Thread t2=new Thread(new Runnable() {
@Override
public void run() {
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("B");
}
});
Thread t3=new Thread(new Runnable() {
@Override
public void run() {
try {
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("C");
}
});
t1.start();
t2.start();
t3.start();
}
}
用例 类似 ExecutorService 线程池 里的线程执行完,执行主线程
import java.util.Date;
public class Demo1 {
public static void main(String[] args) {
Date d1=new Date();
System.out.println("开始添加缓存");
Demo1 demo1=new Demo1();
demo1.t();
Date d2=new Date();
long time=d2.getTime()-d1.getTime();
System.out.println("结束添加缓存,耗时:"+time +"ms");
}
public void t(){
for(int i=0;i<10;i++){
Thread t=new Thread(new Runnable() {
@Override
public void run() {
String group=Thread.currentThread().getThreadGroup().getName();
String name=Thread.currentThread().getName();
System.out.println(group+"---"+name+"---aaaa");
}
});
t.start();
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}