返回顶部
首页 > 资讯 > 后端开发 > Python >java多线程join()方法的作用和实现原理解析(应用场景)
  • 569
分享到

java多线程join()方法的作用和实现原理解析(应用场景)

2024-04-02 19:04:59 569人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

1、join() 方法的作用     这个方法的作用是先将当前线程挂起,待其他线程结束后在执行当前线程的代码; 2、应用场景 比如有三个人小红、小李、小王, 三

1、join() 方法的作用

    这个方法的作用是先将当前线程挂起,待其他线程结束后在执行当前线程的代码;

2、应用场景

比如有三个人小红、小李、小王, 三个人相约一起去酒店吃饭,菜已经点好了, 三个人从不同的地方出发,只有三个人都到了酒店之后才会开始上菜;那么这三个人就分别代表三个线程,这三个线程执行完之后才会执行 “上菜” 的代码逻辑,

代码示例


package com.Lock;
 

public class ConutDownLatchJoinDemo implements Runnable {
 
 
    @Override
    public void run() {
 
        System.out.println(Thread.currentThread().getName() + "开始出发了");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "到酒店了");
 
 
    }
}
 
// 酒店线程
class Hotel2 implements  Runnable{
 
    Thread thread;
 
    public Hotel2 ( Thread thread){
        this.thread = thread;
    }
    @Override
    public void run() {
 
        System.out.println(Thread.currentThread().getName() +"正在等待大家的到来.....");
        try {
            // 待其他线程执行完成后在执行下面的代码
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("人齐了,"+Thread.currentThread().getName() +"服务员开始上菜");
    }
}
class Main2 {
    public static void main(String[] args) throws InterruptedException {
 
        Thread t1 = new Thread(new ConutDownLatchJoinDemo(), "小红");
        Thread t2 = new Thread(new ConutDownLatchJoinDemo(), "小王");
        Thread t3 = new Thread(new ConutDownLatchJoinDemo(), "小李");
 
        // 三个人同时出发
        t1.start();
        t2.start();
        t3.start();
 
        // 酒店也开始着手准备好将要上的菜
        new Thread(new Hotel2(t3),"酒店").start();
 
 
    }
}

打印结果

3、坑点

java的join方法中,这里有一个坑,就是下面这个方法


Thread.currentThread().join();

我们都知道 ,join方法的作用是阻塞,即等待线程结束,才继续执行。如果调用了Thread.currentThread().join(); 这个方法,那么线程一直在阻塞,无法终止。因为它自己在等待自己结束;这无疑会造成死

接下来我们来测试一把,代码和上面的一样,只需要改一行代码即可,在上面的代码的Hotel.run()方法中,将 t3.join(); 改为 Thread.currentThread().join(); 即可;


// 酒店线程
class Hotel2 implements  Runnable{
 
    Thread thread;
 
    public Hotel2 ( Thread thread){
        this.thread = thread;
    }
    @Override
    public void run() {
 
        System.out.println(Thread.currentThread().getName() +"正在等待大家的到来.....");
        try {
            //  将  t3.join(); 改为 Thread.currentThread().join();
            Thread.currentThread().join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("人齐了,"+Thread.currentThread().getName() +"服务员开始上菜");
    }
}

运行后结果如下

所以这个方法一定不要直接使用;

4、join方法的实现原理

    说了这么多,也举了这么多例子了,join方法是怎么实现线程等待的呢?我点进去join方法内部可以看到,其实它的内部也就是调用了wait()方法,

只不过它多做了一步,用了一个循环来判断线程是否还活着,isAlive()方法就是用来判断线程是否还活着;

4.1、join方法实现原理的疑问

那么这个时候肯定有的同学就有疑问了,只看到join()方法调用了wait()方法,但是没看到有调用notify() 或者 notifyAll() 系列的唤醒方法,那它是怎么唤醒的呢?如果不唤醒,那不就一直等待下去了吗?

原来啊,在java中,Thread类线程执行完run()方法后,一定会自动执行notifyAll()方法

 这是notifyAll()非常重要的隐藏知识点,这个细节隐藏在Java的Native方法中,所以一般不会被人发现。我们观察C/C++源码,如下:


oid JavaThread::exit(booldestory_vm, ExitTypeexit_type);
static void ensure_join(JavaThread*thread) {
	Handle threadObj(thread, thread -> threadObj());
	ObjectLocker lock(threadObj, thread);
	thread -> clear_pending_exception();
	java_lang_Thread::set_thread_status(threadObj(), java_lang_Thread::TERMINATED);
	java_lang_Thread::set_thread(threadObj(), NULL);
     //下行执行了notifyAll()操作
	lock.notify_all(thread);
	thread -> clear_pending_exception();
}

其中ensure_join就是执行join()方法,等方法执行结束时,此行代码lock.notify_all(thread);意思是通过notifyAll()唤醒了所有等待线程。所以在使用线程的时候,要特别注意 

到此这篇关于java多线程join()方法的作用和实现原理的文章就介绍到这了,更多相关java多线程join()内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: java多线程join()方法的作用和实现原理解析(应用场景)

本文链接: https://lsjlt.com/news/129808.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java多线程join()方法的作用和实现原理解析(应用场景)
    1、join() 方法的作用     这个方法的作用是先将当前线程挂起,待其他线程结束后在执行当前线程的代码; 2、应用场景 比如有三个人小红、小李、小王, 三...
    99+
    2024-04-02
  • Java多线程的应用场景和应用目的实例分析
    Java多线程的应用场景和应用目的实例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。通俗的解释一下多线程先:多线程用于堆积处理,就像一个大土堆,一个推土机很慢,那么10个推...
    99+
    2023-06-19
  • Java多线程使用方式和实现原理
    本篇内容介绍了“Java多线程使用方式和实现原理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java中的线程Java之父对线程的定义是:线...
    99+
    2023-06-02
  • Java和Linux教程:重定向的应用场景及实现方法详解!
    重定向是计算机中常用的一种技术,它可以将程序的输出结果或错误信息输出到指定的文件或设备中,从而方便我们进行查看和处理。在Java和Linux中,重定向也是一种非常常用的技术,本文将详细介绍重定向的应用场景及实现方法。 一、Java中的重定...
    99+
    2023-06-04
    linux 教程 重定向
  • JAVA多线程中join()方法的使用方法
    虽然关于讨论线程join()方法的博客已经非常极其特别多了,但是前几天我有一个困惑却没有能够得到详细解释,就是当系统中正在运行多个线程时,join()到底是暂停了哪些线程,大部分博客...
    99+
    2024-04-02
  • SpringBoot线程池和Java线程池的使用和实现原理解析
    目录SpringBoot线程池和Java线程池的用法和实现原理使用默认的线程池方式一:通过@Async注解调用方式二:直接注入 ThreadPoolTaskExecutor...
    99+
    2023-05-15
    SpringBoot线程池和Java线程池用法 SpringBoot线程池
  • Java ThreadLocal原理解析以及应用场景分析案例详解
    目录ThreadLocal的定义ThreadLocal的应用场景ThreadLocal的demoTheadLocal的源码解析ThreadLocal的set方法ThreadLocal...
    99+
    2024-04-02
  • 浅析css隐藏div块的实现方法和应用场景
    CSS的隐藏功能在网页设计中起着重要的作用,尤其是在实现动态效果的过程中。在这个过程中,隐藏Div块是经常用到的一种方法。本文将为大家介绍CSS隐藏Div块的实现方法和应用场景。一、CSS隐藏Div块的实现方法display属性displa...
    99+
    2023-05-14
  • Python中的进程池和线程池的适用场景和实现原理是什么?
    Python中的进程池和线程池的适用场景和实现原理是什么?引言:在编写程序时,为了提高执行效率,经常会使用并发编程来同时执行多个任务。Python提供了进程池和线程池这两种用于并发处理任务的工具。本文将详细介绍进程池和线程池的适用场景和实现...
    99+
    2023-10-22
    线程池 实现原理 进程池 适用场景
  • java多线程Synchronized实现可见性原理解析
    Synchronized实现可见性原理 可见性 要实现共享变量的可见性,必须保证两点: 线程修改后的共享变量值能够及时从工作内存刷新到主内存中 其他线程能够及时把共...
    99+
    2024-04-02
  • java多线程的原理及用法
    这篇文章主要介绍“java多线程的原理及用法”,在日常操作中,相信很多人在java多线程的原理及用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java多线程的原理及用法”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-20
  • Android数据双向绑定原理实现和应用场景
    目录一、使用databinding类二、双向绑定安卓的数据双向绑定类似Vue这种前端框架,只要修改模型的数据,页面上显示的数据也会跟着变化,不需要取出控件来赋值。 一、使用datab...
    99+
    2023-05-17
    Android数据双向绑定 Android数据绑定 Android双向绑定
  • ASP中同步数组的操作方法及应用场景解析。
    ASP中同步数组的操作方法及应用场景解析 在ASP编程中,数组是一种非常常见的数据类型。数组是由一系列相同类型的元素组成的集合,这些元素可以按照一定的顺序访问。数组的使用可以使程序的编写更加简单、清晰,也可以提高程序的运行效率。然而,在实际...
    99+
    2023-11-04
    同步 数组 教程
  • 深入理解Java中Filter的作用种类及应用场景
    目录如何使用FilterFilter的生命周期Filter执行顺序Filter细节自动登录BeanUtils的使用总结如何使用Filter 在Java Web应用程序中,使用Filt...
    99+
    2023-05-18
    Java Filter Java Filter作用
  • 数据库水平分割详解:理解概念、实现方法和应用场景
    数据库水平分割是一种将数据存储在多台服务器上的技术,以便在多个位置访问数据。水平分割的一个主要优点是它可以提高查询性能,因为查询可以分布在多个服务器上进行处理。水平分割还提供了更高的可用性,因为如果其中一台服务器出现故障,其他服务器仍然可...
    99+
    2024-02-24
    数据库 水平分割 分库分表 负载均衡 查询性能 管理
  • Java线程池工作原理和使用方法是什么
    这篇文章主要介绍“Java线程池工作原理和使用方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java线程池工作原理和使用方法是什么”文章能帮助大家解决问题。1. 为什么要使用线程池使用线程...
    99+
    2023-07-04
  • golang函数闭包实现的原理和使用场景
    go 中闭包原理:函数内嵌函数返回时,内嵌函数可访问外层函数变量,形成封闭环境。使用场景:1. 保持状态:闭包可维护内嵌函数状态,即使外层函数已返回;2. 延迟执行:用于延迟执行代码;3...
    99+
    2024-04-23
    golang 闭包
  • Java 程序中的多线程原理及用法
    这篇文章主要讲解了“Java 程序中的多线程原理及用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java 程序中的多线程原理及用法”吧!  为什么会排队等待?   下面的这个简单的 Ja...
    99+
    2023-06-03
  • 解析 PHP 中点操作符的重要性和应用场景
    标题:PHP 中点操作符的重要性和应用场景解析 在PHP中,点操作符(.)是连接两个字符串的运算符,也称为字符串连接符。尽管在一些编程语言中,使用加号(+)来连接字符串更为常见,但在P...
    99+
    2024-04-02
  • 二维码同步函数的实现原理和应用场景是什么?
    随着移动互联网的普及,二维码作为一种便捷的信息传递方式逐渐成为了人们生活中不可或缺的一部分。在二维码的实现过程中,同步函数起着至关重要的作用。本文将介绍二维码同步函数的实现原理和应用场景,并且提供相应的演示代码。 一、实现原理 二维码同步...
    99+
    2023-10-17
    函数 同步 二维码
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作