Java并发编程之美->读书笔记
在项目实践中经常会遇到一个场景,就是需要等待某几件事情完成后才能继续往下执行,比如
多个线程加载资源,需要等待多个线程全部加载完毕再汇总处理。 Thread 类中有
一个 join 方法就可以做这个事情,前面介绍的等待通知方法是Object类中的方法,而join
方法 Thread类直接提供的。 join是无参且返回值为 void 的方法。下面来看一个简单
的例子。
package thread; /** * @description: * @author: lv * @time: 2020/7/28 15:13 */ public class Demo { public static void main(String[] args) throws InterruptedException{ Thread threadOne = new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("child threadOne over"); } }); Thread threadTwo = new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("child threadTwo over"); } }); threadOne.start(); threadTwo.start(); //等待子线程执行完毕返回 threadOne.join(); threadTwo.join(); } }
如上代码在主线程里面启动了两个子线程,然后分别调用了它 join方法,那
么主线程首先会在调用threadOne.join方法后被阻塞,等待threadOne执行完毕后返回。
threadOne执行完毕后threadOne.join就会返回,然后主线程调用threadTwo.join方法后
再次被阻塞,等待threadTwo执行完毕后返回。这里只是为了演示join方法的作用,在这
种情况下使用后面会讲到的CountDownLatch是个不错的选择
另外,线程A调用线程B的join方法后会被阻塞,当其他线程调用了线程A的
interrupt方法中断了线程A时,线程A会抛出InterruptedException异常而返回。