Java多线程join()方法

Java多线程join()方法

一、概述

1、join():等待这个线程死亡,相当于join(0)。
2、join(int n) :最多等待n毫秒之后在处理
-2.1、join的时间 < sleep的时间,那么sleep就会停止,运行时间就是join的时间
-2.2、join的时间 > sleep的时间,那么sleep就会接着运行,运行时间是sleep的时间;
注意:join是Thread类中的方法,要用Thread来进行调用处理。join的底层是wait()
t1.join()表示: 等待t1线程运行结束之后,程序才能接着运行,接着执行。
使用情况:一个线程要等待另外一个线程执行完成,然后得到他的结果的时候使用。

二、演示

1、创建两个线程,t1线程要等待t2线程结束之后,才能进行运行的处理。

public class Test09 {
    public static void main(String[] args) {
        // 创建t1线程
        Thread t1 = new Thread(() -> {
            System.out.println("t1");
        });

        // 创建t2线程
        Thread t2 = new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("t2");
        });

        // 等t2结束之后执行t1
        t2.start();
        try {
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t1.start();

    }
}

运行结果:

在这里插入图片描述

2、使用等待线程的运行结果的处理,我们在t1线程中对变量进行了修改,然后等待这个结果

public class Text05 {
    int i = 0;
    public static void main(String[] args) {
        Text05 text05 = new Text05();
        text05.f();
    }

    public void f(){
        // 创建线程,在线程中给i进行赋值
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                try {
                    TimeUnit.SECONDS.sleep(1);
                    i = 10;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        Thread t1 = new Thread(runnable);
        // 运行线程
        t1.start();
        System.out.println("未使用join的结果为:"+i);
        try {
            // join等待thread线程结束之后,在接着运行
            t1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("使用了join的结果为:"+i);

    }
}

运行结果:

在这里插入图片描述

3、join(int n) 的处理:
* 等够时间 和 没等够时间的处理

  • 1、join的时间 < sleep的时间,那么sleep就会停止,运行时间就是join的时间
  • 2、join的时间 > sleep的时间,那么sleep就会接着运行,运行时间是sleep的时间
public class Text06 {
    int i = 0;
    public static void main(String[] args) {
        Text06 text06 = new Text06();
        text06.test();
    }

    public  void test(){
        Thread thread = new Thread() {
            @Override
            public void run() {
                // sleep -> 2s的处理
                try {
                    TimeUnit.SECONDS.sleep(2);
                    i=20;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        long start = System.currentTimeMillis();
        thread.start();

        try {
            // join的时间没有sleep的时间长,会直接终止睡眠
            thread.join(1500);
            // join的时间比sleep长,实际消耗的时间就是sleep的时间,
//             thread.join(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        long end = System.currentTimeMillis();
        log.debug("输出的结果为:"+i+",消耗的时间为: "+(end - start));
        System.out.println("输出的结果为:"+i+",消耗的时间为: "+(end - start));
    }
}

thread.join(1500)没等够时间 运行结果:线程没运行完就结束了,没得到i的赋值
thread.join(1500)结果
thread.join(4000)等够时间 运行结果:线程运行完了,得到了i的赋值

在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值