JAVA-多线程join()等待一个线程

引言:更多线程的认识可以看一篇博客:

JAVA-Thread类实现多线程-CSDN博客

一、join()的作用

我们知道线程是随机调度执行的,但是有时候我们需要另一个任务完成了,我们才能继续,这个时候我们就可以使用join去等待线程结束。

例如:别人向我转100万,需要转完了我再看是否接收到了100万。

二、代码举例

java 复制代码
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            for (int i = 0; i < 3; i++) {
                System.out.println("我正在向作者赚钱");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        System.out.println("作者准备接收钱");
        //创建t线程,并调用run方法
        t.start();

        //main线程等待t线程结束
        t.join();
        System.out.println("作者收到了,等待结束");
    }

结果:

谁调用join谁就等,在主线程中调用 t.join() ,就是main线程等待 "t" 线程结束。

三、join() 抛出的异常

除了join,sleep也会抛出这样的一个异常:

如果是run方法中使用,不能使用throws向上抛,因为Thread类中没有处理这个异常,我们只能使用try catch处理掉这个异常。

如果是在主方法中我们可以通过throws抛给JVM来处理这个异常,或者try catch 也是可以的:

四、join()的重载

|-------------------------------------------|-----------------------|
| 方法 | 说明 |
| public void join() | 死等线程结束 |
| public void join(long millis) | 等待线程结束,最多millis毫秒 |
| public void join(long millis , int nanos) | 同理,但可以更高精度(纳秒级别) |

第三种了解就可以了,普通的计算机很难精确到纳秒,精确到毫秒就不错了。

这里着重讲一下第三种,只要时间到就继续执行,不会等到 t 线程结束。

java 复制代码
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            //大概5秒
            for (int i = 0; i < 5; i++) {
                System.out.println("hello Thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        });

        t.start();
        System.out.println("main开始等待");
        //大概3秒
        t.join(3000);
        System.out.println("main等待结束");
    }

任意线程都可以进行等待,不是只有主线程可以去等待别的线程。

五、多个线程的等待

java 复制代码
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            //大概5秒
            for (int i = 0; i < 5; i++) {
                System.out.println("hello t1");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        });

        Thread t2 = new Thread(() -> {
            //大概5秒
            for (int i = 0; i < 5; i++) {
                System.out.println("hello t2");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        });

        t1.start();
        t2.start();
        System.out.println("main开始等待");
        //大概3秒
        t1.join();
        t2.join();
        System.out.println("main等待结束");
    }

这样写可以保证线程之间的执行关系:

java 复制代码
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            //大概5秒
            for (int i = 0; i < 3; i++) {
                System.out.println("hello t1");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        });

        Thread t2 = new Thread(() -> {
            //大概5秒
            for (int i = 0; i < 3; i++) {
                System.out.println("hello t2");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        });


        t1.start();
        t1.join();

        t2.start();
        t2.join();
    }
相关推荐
Bigemap4 分钟前
BigemapPro快速添加历史影像(Arcgis卫星地图历史地图)
java·开发语言
IT学长编程7 分钟前
计算机毕业设计 基于Hadoop的健康饮食推荐系统的设计与实现 Java 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
java·大数据·hadoop·毕业设计·课程设计·推荐算法·毕业论文
hrrrrb16 分钟前
【Python】字符串
java·前端·python
进击的_鹏16 分钟前
【C++11】initializer_list列表初始化、右值引用和移动语义、可变参数模版等
开发语言·c++
mark-puls22 分钟前
C语言打印爱心
c语言·开发语言·算法
mkhase23 分钟前
9.12-QT-基本登陆界面实现
java·jvm·qt
yinke小琪26 分钟前
说说hashCode() 和 equals() 之间的关系
java·后端·面试
若鱼191930 分钟前
Kafka如何配置生产者拦截器和消费者拦截器
java·kafka
西阳未落30 分钟前
C语言柔性数组详解与应用
c语言·开发语言·柔性数组
Huhbbjs30 分钟前
SQL 核心概念与实践总结
开发语言·数据库·sql