Join()的用法
Join()它的作用是调用线程,等待该线程执行结束后才可以继续往下执行。
public class Join {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread("thread-1"){
public void run(){
for(int i=0;i<10;i++){
System.out.println(i);
}
System.out.println(Thread.currentThread().getName());
}
};
thread.start();
thread.join();
System.out.println("main end");
}
}
当我们使用join()时,main线程会处于堵塞状态(BLOCKED),它会等待thread-1线程执行完,即join()结束,main线程才会进入Runnable状态(就绪),获取CPU资源进入到Running状态(就绪状态)。才能执行“ main end”(因为这个输出语句是main线程的)。
如图所示:
当我们将join()注释掉时,则表示这两个线程的执行是同时进行的。如图所示:
sleep(long)方法效执行的效果也是一样的。只不过不同的是:
join的内部实现是wait(),所以使用join()方法是会释放锁的,那么其他线程就可以调用此线程的同步方法了,而sleep(long)方法具有不是放锁的特点,因此线程会一直等待下去,直到任务完成,才会释放锁。
注:join()方法如果遇到线程的interrupt()方法有可能会出现出现异常,例如:A线程等待B线程执行任务,B线程执行到一半之后interrupt()了,此时会报 java.lang.InterruptedException异常。此时A线程并不会终止,还是处于正常运行状态。
原理图: