0.6、多线程学习—— Thread.join() 等等我,马上到

本文通过王者荣耀游戏中的推塔场景,生动地解释了Java中Thread.join()方法的使用。介绍了join()方法的基本功能,包括阻塞调用线程直至目标线程结束、处理中断异常、重复调用的效果以及有限或永久等待的概念。

前言

体能状态先于精神状态,习惯先于决心,聚焦先于喜好。

Thrad.join()

join() 方法在源码中的注释是: Waits for this thread to die(等待该线程死亡)
即,加入在线程1中调用线程2.join()方法,那么线程1就需要等到线程2运行结束后才能继续运行,即 线程2.join() 会阻塞线程1 直到线程2 运行结束。
允许多个线程调用线程2.join(),则多个线程都会阻塞。

如果thread.join()过程中被中断则抛出异常

源码中显示 如果当前线程被中断,则系统抛出异常

允许重复调用 thread.join()

join()方法被 synchronized修饰,多次调用等同于一次调用

有限等待或永久等待

thread.join() 会阻塞 调用该方法的其他线程,如果线程调用自己的join方法,则可能造成永久阻塞。
Thread.join(n) 可以指定阻塞时间,当n=0时表示永久等待。
线程1调用 线程2.join(n) 可以指定线程1阻塞时间,如果在n毫秒过去后,线程2 还没有运行结束,线程1 会停止阻塞,而是进入运行状态。

//默认单位 毫秒 milliseconds
soldierLine.join(2000);

用王者荣耀举例子

推塔:兵线进入防御塔后才可以推塔

王者荣耀是一款推塔游戏,只有当己方兵线进入对方防御塔攻击访问内时英雄才可以在免伤害的情况下高效率的推塔,否则对塔的伤害很低,并且很难提抗防御塔的伤害。

线程模拟

这里我们使用两个线程分别模拟兵线和英雄,根据刚才的规则描述,只有当兵线到达后英雄才开始推塔,这里就是在 英雄的线程中调用 兵线的 join()方法,然后英雄的线程开始推塔。这看起来就好像兵线说:等等我,马上到。

Java 代码

我们创建两个英雄线程和一个兵线线程
两个英雄线程调用 兵线线程.join()

/**
 * Thread.join()阻塞调用方的线程知道被调用线程运行结束测试
 * jie.wu
 */
public class JoinTest {
   public static void main(String [] args){
        //兵线
        Thread soldierLine=new Thread("兵线"){
            @Override
            public void run() {
                super.run();
                System.out.println(Thread.currentThread().getName()+",出发了,预计3秒后到达敌方防御塔");
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+",我进入防御塔攻击范围了");
            }
        };

        //英雄
        Thread hero=new Thread("英雄"){
            @Override
            public void run() {
                super.run();
                System.out.println(Thread.currentThread().getName()+":我到达对方防御塔边缘了,开始等待兵线:");
                try {
                    soldierLine.join();
                    System.out.println(Thread.currentThread().getName()+",兵线已到,开始攻击防御塔···敌方防御塔被摧毁了");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        };
        //英雄
        Thread hero2=new Thread("英雄2"){
            @Override
            public void run() {
                super.run();
                System.out.println(Thread.currentThread().getName()+":我到达对方防御塔边缘了,开始等待兵线:");
                try {
                    soldierLine.join();
                    System.out.println(Thread.currentThread().getName()+",兵线已到,开始攻击防御塔···敌方防御塔被摧毁了");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        };

        //英雄出发
        hero.start();
        hero2.start();
        //兵线出发
        soldierLine.start();
    }
}
结果展示
英雄2:我到达对方防御塔边缘了,开始等待兵线:
英雄:我到达对方防御塔边缘了,开始等待兵线:
兵线,出发了,预计3秒后到达敌方防御塔
兵线,我进入防御塔攻击范围了
英雄,兵线已到,开始攻击防御塔···敌方防御塔被摧毁了
英雄2,兵线已到,开始攻击防御塔···敌方防御塔被摧毁了

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值