返回顶部
首页 > 资讯 > 后端开发 > Python >Java四个线程常用函数超全使用详解
  • 476
分享到

Java四个线程常用函数超全使用详解

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

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

摘要

目录前言1. wait()2. join()3. sleep()4. yield()5. 总结5.1 wait和join的区别5.2 wait和sleep的区别前言 之前没怎么关注到

前言

之前没怎么关注到这两个的区别以及源码探讨

后面被某个公司面试问到了,开始查漏补缺

1. wait()

使当前线程等待,直到它被唤醒,通常是通过被通知或被中断,或者直到经过一定的实时时间。

本身属于一个Object 类,查看源代码也可知:public class Object {

查看其源码可知,一共有三个重载的方法,详情源代码如下:

//第一个重载函数
public final void wait() throws InterruptedException {
        wait(0L);
    }
    
//第二个重载函数
public final native void wait(long timeoutMillis) throws InterruptedException;


//第三个重载函数
public final void wait(long timeoutMillis, int nanos) throws InterruptedException {
        if (timeoutMillis < 0) {
            throw new IllegalArgumentException("timeoutMillis value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos > 0 && timeoutMillis < Long.MAX_VALUE) {
            timeoutMillis++;
        }

        wait(timeoutMillis);
    }

具体实战调用代码如下:

如果执行到了wait函数,在这4秒内,会释放,并且暂停线程。如果这四秒内配合notify()可以唤醒并且得到锁,如果没有唤醒,等待其他来竞争。4秒结束后,会默认自动释放锁

当前线程在 Thread.wait()等待过程中,如果Thread结束了,是可以自动唤醒的而且自动释放锁

@Override
public void run() {
       synchronized (a) {
           a.wait(4000);      
       }
}

2. join()

join是Thread类的方法

查看其源码,具体源码如下,三个重载的方法

//第一个重载函数
public final synchronized void join(final long millis)
    throws InterruptedException {
        if (millis > 0) {
            if (isAlive()) {
                final long startTime = System.nanoTime();
                long delay = millis;
                do {
                    wait(delay);
                } while (isAlive() && (delay = millis -
                        TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime)) > 0);
            }
        } else if (millis == 0) {
            while (isAlive()) {
                wait(0);
            }
        } else {
            throw new IllegalArgumentException("timeout value is negative");
        }
    }


//第二个重载函数

public final synchronized void join(long millis, int nanos)
throws InterruptedException {

    if (millis < 0) {
        throw new IllegalArgumentException("timeout value is negative");
    }

    if (nanos < 0 || nanos > 999999) {
        throw new IllegalArgumentException(
                            "nanosecond timeout value out of range");
    }

    if (nanos > 0 && millis < Long.MAX_VALUE) {
        millis++;
    }

    join(millis);
}


//第三个重载函数

public final void join() throws InterruptedException {
     join(0);
 }

主要的时间参数逻辑如下:

  • 小于0,抛出异常
  • 等于0,join(A),判断A是否存在,存在才执行操作。该线程执行wait(0)等待,等待A线程执行完后才可结束
  • 大于0,同上,只不过执行的是wait(long millis),等待时间结束后才可继续执行操作

3. sleep()

对比上一个wait函数

  • sleep(long mills):让出CPU资源,但是不会释放锁资源。
  • wait():让出CPU资源和锁资源。

查看sleep函数的源码,一共有两个重载函数

都是Thread类的函数


public static native void sleep(long millis) throws InterruptedException;




public static void sleep(long millis, int nanos)
    throws InterruptedException {
        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos > 0 && millis < Long.MAX_VALUE) {
            millis++;
        }

        sleep(millis);
    }

4. yield()

查看yield()函数的源码,一个重载函数

都是Thread类的函数

向调度器暗示当前线程愿意放弃当前对处理器的使用。 调度器可以忽略这个提示。

Yield是一种启发式尝试,旨在改善线程之间的相对进程,否则会过度使用CPU。 它的使用应该与详细的分析和基准测试相结合,以确保它实际上具有预期的效果。

使用这种方法很少是合适的。 它可能用于调试或测试目的,在这些目的中,它可能有助于由于竞争条件而重新生成错误。 在设计并发控制构造(如java.util.concurrent.locks包中的构造)时,它可能也很有用。

public static native void yield();

总的来说,yield函数的功能主要是:

让出CPU调度,暂停线程,但不能由用户指定时间

只能让同优先级有执行机会

5. 总结

wait 暂停该线程,让出cpu,释放锁。(Object类)

join暂停该线程,执行该线程之后才能回到自身的线程运行。(Thread类)

sleep 暂停该线程,让出cpu,不释放锁。(Thread类)

yield 暂停该线程,但是不能由用户制定,只能让同优先级有执行机会。(Thread类)

5.1 wait和join的区别

看完以上的源码以及逻辑代码,再讲讲两者的异同

总的来说

  • wait函数:让当前线程进入等待状态,wait()会与notify()和notifyAll()方法一起使用。notify为唤醒函数
  • join函数:等待这个线程结束才能执行自已的线程。它的主要起同步作用,使线程之间的执行从“并行”变成“串行”。线程A中调用了线程B的join()方法时,线程

执行过程发生改变:线程A,必须等待线程B执行完毕后,才可以继续执行下去

共同点:

  • 暂停当前的线程
  • 都可以通过中断唤醒

不同点在于:

区别waitjoin
Object类Thread类
目的线程间通信排序,让其串行通过
同步必须要synchronized可以不用synchronized

5.2 wait和sleep的区别

wait():让出CPU资源和锁资源。

sleep(long mills):让出CPU资源,但是不会释放锁资源。

看区别,主要是看CPU的运行机制:

它们的区别主要考虑两点:1.cpu是否继续执行、2.锁是否释放掉。

归根到底:

wait,notify,notifyall 都是Object对象的方法,是一起使用的,用于锁机制,所以会释放锁

而sleep是Thread类,跟锁没关系,不会释放锁

但是两者都会让出cpu资源

以上就是Java四个线程常用函数超全使用详解的详细内容,更多关于Java线程函数的资料请关注编程网其它相关文章!

--结束END--

本文标题: Java四个线程常用函数超全使用详解

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

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

猜你喜欢
  • Java四个线程常用函数超全使用详解
    目录前言1. wait()2. join()3. sleep()4. yield()5. 总结5.1 wait和join的区别5.2 wait和sleep的区别前言 之前没怎么关注到...
    99+
    2024-04-02
  • Java四个线程常用函数是什么
    这篇文章主要介绍了Java四个线程常用函数是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. wait()使当前线程等待,直到它被唤醒,通常是通过被通知或被中断,或者直...
    99+
    2023-06-29
  • Java中四种线程池的使用示例详解
    在什么情况下使用线程池? 单个任务处理的时间比较短 将需处理的任务的数量大使用线程池的好处: 减少在创建和销毁线程上所花的时间以及系统资源的开销 如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。 本文详细的给...
    99+
    2023-05-31
    java 线程池 ava
  • Java使用线程同步解决线程安全问题详解
    第一种方法:同步代码块: 作用:把出现线程安全的核心代码上锁 原理:每次只能一个线程进入,执行完毕后自行解锁,其他线程才能进来执行 锁对象要求:理论上,锁对象只要对于当前同时执行的线...
    99+
    2024-04-02
  • Pythonasyncio常用函数使用详解
    目录协程的定义协程的运行多个协程运行关于loop.close()回调事件循环协程的定义 需要使用 async def 语句 协程可以做哪些事: 1、等待一个future结果 2、等待...
    99+
    2023-03-14
    Python asyncio原理 Python asyncio
  • 详解Java线程中常用操作
    目录线程的常用操作守护线程(后台线程)线程串行化线程优先级线程中断线程的常用操作 设置线程名字:setName() 获取线程名称:getName() 线程唯一Id:getId() /...
    99+
    2024-04-02
  • Python常用内置函数的使用教程详解
    目录导言一、abs()二、aiter()函数三、all()函数四、anext()五、any()函数六、ascii()函数导言 Python官方文档对于内置函数的介绍较为简略...
    99+
    2023-05-14
    Python常用内置函数使用 Python常用内置函数 Python 内置函数
  • SQL常用的四个排序函数梳理
    目录前言1.ROW_NUMBER()1.1 对学生成绩排序示例2.RANK() 3.DENSE_RANK() 4.NTILE()前言 今天就给大家介绍四个你不怎么常用排序函数,他们就是SQL Serv...
    99+
    2022-07-01
    SQL常用排序函数 SQL排序函数
  • Java中线程函数如何使用
    Java中线程函数如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1) 通过yield ()Java线程函数,可使线程进入可执行状态,排程器从可执行状态的...
    99+
    2023-06-17
  • 四个实例超详细讲解Java 贪心和枚举的特点与使用
    目录贪心:枚举:1.朴素枚举2.状压枚举   算法题1:示例算法题2:示例算法题3: 示例1示例2算法题4: 示例笔试技巧:学会根据数据范围猜...
    99+
    2024-04-02
  • C# String常用函数的使用详解
    目录RemoveSubstring Replace Spilt Join Append Remove Remove(int startIndex) 删除此字符串中从指定位置...
    99+
    2024-04-02
  • Python列表常用函数使用详解
    目录介绍 append()extend()insert()pop()remove()介绍  append() 语法 list.append( element ) 参数 el...
    99+
    2024-04-02
  • java多线程JUC常用辅助类详解
    1.countDownLatch 减法计数器:实现调用几次线程后,在触发另一个任务 简单代码实现: 举例说明:就像五个人在同一房间里,有一个看门的大爷,当五个人都出去后,他才能锁门...
    99+
    2024-04-02
  • Java多线程之线程池七个参数详解
    目录corePoolSize:核心线程数maximumPoolSize:最大线程数keepAliveTime:空闲线程存活时间unit:时间单位workQueue:工作队列threa...
    99+
    2024-04-02
  • 分享四个python接口常用封装函数
    目录1.封装上传图片的函数2. 封装车牌号的函数3. 封装生成UUid 函数4. 封装连接数据库的函数前言: 又到每日分享Python小技巧的时光了,今天给大家分享的是Python接...
    99+
    2024-04-02
  • python处理json文件的四个常用函数
    目录一,json.load()和json.dump只要用于读写json数据二,json.loads和json.dumps主要用于字符串和字典之间的类型转换三,练习1编写一个json格...
    99+
    2024-04-02
  • 用PHP来统计在线人数的四个方法详解
    本篇文章给大家带来了关于PHP的相关知识,其中主要介绍了怎么实现统计在线人数的问题,可以利用表统计方式、用redis有序集合统计、用hyperloglog做统计等等,下面一起来看一下,希望对大家有帮助。一个业务系统网站每天人数的访问量是多少...
    99+
    2022-06-14
    php
  • Java中线程上下文类加载器超详细讲解使用
    目录一、什么是线程上下文类加载器1.1、重要性1.2、使用场景二、ServiceLoader简单介绍三、案例3.1、使用ServiceLoader加载mysql驱动3.2、Class...
    99+
    2022-12-22
    Java线程上下文类加载器 Java类加载器
  • python常用函数详解
    1.函数的介绍 为什么要有函数?因为在平时写代码时,如果没有函数的话,那么将会出现很多重复的代码,这样代码重用率就比较低。。。并且这样的代码维护起来也是很有难度的,为了解决这些问题,就出现了函数,用来将一些...
    99+
    2022-06-04
    详解 函数 常用
  • prototype.js常用函数详解
    Prototype.js是一个基于JavaScript的开源框架,它提供了许多常用的函数和工具方法,方便开发者快速开发和操作网页。下...
    99+
    2023-08-11
    prototype.js
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作