Join方法

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

 

Join方法

上一篇:关于kafka的身份认证方法


下一篇:会话及会话技术