join方法的应用场景如下:
A线程调用B线程的join方法,等待B线程执行完成后,A线程才可以执行后续操作。在B线程完成之前,A线程处于阻塞状态。
join方法特点:
1、join方法需要线程对象调用
2、调用join时,当前线程被阻塞
3、只有join对应的线程执行完成之后,当前线程才能继续执行
以卖西瓜为例,这里牵涉到至少买方付款,卖家收款,卖西瓜(main)三条线程
package com.demo.callback; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 卖西瓜 * * @author admin * */ public class SellingWatermelons { private static Logger logger = LoggerFactory.getLogger(SellingWatermelons.class); public static void main(String[] args) { Thread buyThread = new Thread(new Buyer()); Thread sellThread = new Thread(new Seller()); buyThread.start(); sellThread.start(); try { buyThread.join(); } catch (InterruptedException e) { logger.error("", e); } try { sellThread.join(); } catch (InterruptedException e) { logger.error("", e); } logger.info("交易完成"); } } class Buyer implements Runnable { private Logger logger = LoggerFactory.getLogger(Buyer.class); @Override public void run() { try { logger.info("打开手机"); logger.info("扫码"); logger.info("付款"); } catch (Exception e) { logger.error("", e); } } } class Seller implements Runnable { private Logger logger = LoggerFactory.getLogger(Seller.class); @Override public void run() { try { Thread.sleep(2000); logger.info("商家收到付款"); } catch (Exception e) { logger.error("", e); } } }
17:22:34.140 [Thread-0] INFO com.demo.callback.Buyer - 打开手机 17:22:34.154 [Thread-0] INFO com.demo.callback.Buyer - 扫码 17:22:34.154 [Thread-0] INFO com.demo.callback.Buyer - 付款 17:22:36.138 [Thread-1] INFO com.demo.callback.Seller - 商家收到付款 17:22:36.138 [main] INFO com.demo.callback.SellingWatermelons - 交易完成
如果不使用join会出现什么情况?如下为其中的一种情况,用户刚打开手机,交易就显示完成了。
17:09:14.389 [Thread-0] INFO com.demo.callback.Buyer - 打开手机 17:09:14.389 [main] INFO com.demo.callback.SellingWatermelons - 交易完成 17:09:14.404 [Thread-0] INFO com.demo.callback.Buyer - 扫码 17:09:14.404 [Thread-0] INFO com.demo.callback.Buyer - 付款 17:09:16.387 [Thread-1] INFO com.demo.callback.Seller - 商家收到付款
但join方法没有返回值,不确定付款是否成功,或者商家是否真正收到了付款,并且无论是前两者任何一方出现问题,都会完成交易,将西瓜交付给买家,这明显是卖家亏本的。所以join方法的使用有限制,当然上面代码也可以做到获取两个子线程的执行结果,但已经存在现成的可以获取到结果的好方式,因此没有必要在使用join,可以改用FutureTask。https://www.cnblogs.com/qq931399960/p/15200662.html