如何用Java编写代码来等待一个线程join()??

简介: 如何用Java编写代码来等待一个线程join()??

笔者在前面几篇文章中详细的讲解了:线程and进程的区别及其各种对比,如何中断一个线程等文章,接下来本篇文章主要讲解:用Java编写代码来等待一个线程join()??

线程之间是并发执行的,操作系统对于线程的调度是无序的,无法判断两个线程谁先执行结束,谁后执行结束~~

我们先来看一个案列吧:顺便猜一下到底是先输入“hello  main"还是先输出"hello t”呢??

public class Main {
    public static void main(String[] args) {
        Thread t=new Thread(()->{
            System.out.println("hello t");
        });
        t.start();
        System.out.println("hello main");
    }
}

那么,我们来看一下该段代码的运行结果:(多次刷新重新运行,会出现不一样的结果)

至于在前面所提到的:猜一下到底是先输入“hello  main"还是先输出"hello t”呢??这个是无法确定的~~

该段代码在实际执行的时候,大部分情况下都是先出“hello main"(因为线程的创建也有开销),但是不排除特定情况下,主线程的”hello main“没有立即执行到。程序猿是不喜欢不确定的!!有的时候需要明确规定线程的结束顺序----》可以用线程等待来实现(join()方法)

当我们在上述的代码中加入join()方法以后:

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread t=new Thread(()->{
            System.out.println("hello t");
        });
        t.start();
        t.join();
        //是在main线程中调用t.join()
        //意思就是让main线程等待t先结束,再往下执行!!别的线程不受影响~
        System.out.println("hello main");
    }
}

该段代码的运行结果为:

在上述的代码中,我们再main线程里面加入了join()方法:

       t.join();

       是在main线程中调用t.join()

       意思就是让main线程等待t先结束,再往下执行!!别的线程不受影响~

如果是再t1线程中,加入t2.join(),就是让t1线程等待t2先结束,则t1进入阻塞,其他线程正常调度~

阻塞:Blocking:代码走到这一行就停下来,当前这个线程暂时不参与CPU的调度执行~

在上述的代码中:main阻塞了,不参与CPU的调度了,此时只有t去执行了,单个线程确实也谈不上并发不并发了~

  • main线程调用t.join()的时候,如果t还在运行,此时main线程阻塞,直到t执行完毕(t的run()执行完了),main才从阻塞中解除,才继续执行~
  • main线程调用t.join()的时候,如果t已经结束了,此时join()不会阻塞,就会立即往下执行

因此,我们可以得出:确保t是先结束的那个~~

其实对于join()还有另外一个版本:可以填写一个参数,作为”起始时间“;

  1. join()的无参数版本:效果是”死等“(不见不散)~
  2. join()的有参数版本:则是指定最大超时时间(很常见的设定),如果等待的时间到了上限,还没等到,也就不等了~
  3. 互相等待《--------》死锁了!Bug~
相关文章
|
7月前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
510 6
|
8月前
|
IDE Java 关系型数据库
Java 初学者学习路线(含代码示例)
本教程为Java初学者设计,涵盖基础语法、面向对象、集合、异常处理、文件操作、多线程、JDBC、Servlet及MyBatis等内容,每阶段配核心代码示例,强调动手实践,助你循序渐进掌握Java编程。
1072 3
|
8月前
|
安全 Java 应用服务中间件
Spring Boot + Java 21:内存减少 60%,启动速度提高 30% — 零代码
通过调整三个JVM和Spring Boot配置开关,无需重写代码即可显著优化Java应用性能:内存减少60%,启动速度提升30%。适用于所有在JVM上运行API的生产团队,低成本实现高效能。
994 3
|
7月前
|
Java 数据处理 API
为什么你的Java代码应该多用Stream?从循环到声明式的思维转变
为什么你的Java代码应该多用Stream?从循环到声明式的思维转变
355 115
|
7月前
|
安全 Java 编译器
为什么你的Java代码需要泛型?类型安全的艺术
为什么你的Java代码需要泛型?类型安全的艺术
261 98
|
7月前
|
安全 Java 容器
告别繁琐判空:Optional让你的Java代码更优雅
告别繁琐判空:Optional让你的Java代码更优雅
|
7月前
|
安全 Java 容器
告别空指针噩梦:Optional让Java代码更优雅
告别空指针噩梦:Optional让Java代码更优雅
523 94
|
7月前
|
Java 编译器 API
java最新版和java8的区别,用代码展示
java最新版和java8的区别,用代码展示
628 43
|
7月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
387 1

热门文章

最新文章