当前位置: 首页 > news >正文

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

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

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

一、join()的作用

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

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

二、代码举例

    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 线程结束。

    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等待结束");
    }

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

 

五、多个线程的等待

    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等待结束");
    }

 

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

    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();
    }

http://www.dtcms.com/a/77433.html

相关文章:

  • 15 数据结构及算法应用
  • 【面试问题】Java 接口与抽象类的区别
  • python内置函数sorted
  • [解决] PDF转图片,中文乱码或显示方框的解决方案
  • CSS3 基础布局技术与响应式设计
  • JDK动态代理与CGLIB实现的区别?
  • 基于springboot的房屋租赁系统(008)
  • zabbix数据库溯源
  • 大语言模型的“细胞“:拆解语言模型的DNA——Token
  • P2786 英语1(eng1)- 英语作文
  • 生物医药行业百TB级数据同步的实战解决方案
  • 第7章:Docker容器网络模型深度剖析
  • 企业架构流程优化方法论埃森哲(110页PPT)(文末有下载方式)
  • 【C#调用NModbus实现Modbus TCP 主站通讯】
  • 7.2《弹力》
  • 技术分享 | MySQL内存使用率高问题排查
  • grid网格布局图解
  • UDP 协议
  • 【机器学习】核心概念
  • 小程序开发与物联网技术的结合:未来趋势
  • 【一起来学kubernetes】19、Pod使用详解
  • 抖音用户视频批量下载工具开发全解析
  • AI时代:天空卫士如何让企业AIGC应用无忧
  • 800G/1.6T:迈向下一代数据中心网络的关键路径
  • 【算法day15】最接近的三数之和
  • 别让时光溜走!Kairos App 帮你抓住每一刻
  • 再学:ERC721扩展、ERC1155、SBT,OpenSeaNFT市场 NFT Market 习题讲解
  • 知识蒸馏:从软标签压缩到推理能力迁移的工程实践(基于教师-学生模型的高效压缩技术与DeepSeek合成数据创新)
  • 基于yolov11的持刀检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面
  • 数据库(三)