百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

详细介绍一下Java中Thread.sleep和Thread.yield的区别和联系?

yuyutoo 2024-12-10 21:50 4 浏览 0 评论

Thread.sleep和Thread.yield都是在Java中用来进行线程控制的操作方法,但是二者的使用场景和功能有所不同,下面我们就来详细介绍一下二者之间的区别和联系。

Thread.sleep

首先Thread.sleep方法是在Java的Thread类中支持的一个静态方法,其作用就是让线程暂停一段指定的时间,暂停的时间单位是毫秒。这个方法调用之后,会让线程进入到一个阻塞状态并且让出CPU的执行,允许其他线程使用CPU。它有两种使用方式。

  • Thread.sleep(long millis)
  • Thread.sleep(long millis, int nanos)

如下所示

public class SleepExample {
    public static void main(String[] args) {
        System.out.println("Thread is sleeping for 2 seconds...");
        try {
            Thread.sleep(2000); // 暂停2秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Thread woke up.");
    }
}

根据之前的介绍上面方法会让当前线程暂停2秒钟,时间结束之后,现成就会自动恢复到可运行的状态。有兴趣的读者可以将sleep方法和wait方法进行对比。Thread.sleep不会释放锁,当前线程在睡眠过程中持有的锁的状态不会发生变化,

当一个线程进入到Sleep之后,需要处理一个InterruptedException异常,因为在线程睡眠的过程中可能会被其他线程中断操作,这个时候就需要对InterruptedException异常进行处理。

Thread.yield

Thread.yield是Java中Thread类的另一个静态方法,这个方法的作用是主动的建议去让出当前线程对CPU的使用权,提供给其他优先级相同的线程或者是比它线程优先级更高的线程去获取CPU的使用权,但是这里需要注意这个方法只是建议线程让出CPU使用权,并不是一定会让出,也就是说JVM并不能保证线程会暂停,当然也不会保证其他线程一定会获取到使用CPU的机会。

其作用就是提示当前线程放弃CPU控制权,但是否真正让出是由JVM调度器决定。在一般情况下,如果有同优先级的线程在等待,当前线程将进入就绪状态,等待重新获得CPU资源。主要是用来调节线程的执行顺序,帮助避免某些线程长时间占用CPU,但通常很少在业务代码中直接使用。如下所示。

public class YieldExample {
    public static void main(String[] args) {
        Runnable task = () -> {
            for (int i = 0; i < 5; i++) {
                System.out.println(Thread.currentThread().getName() + " - Iteration: " + i);
                Thread.yield();
            }
        };

        Thread thread1 = new Thread(task, "Thread-1");
        Thread thread2 = new Thread(task, "Thread-2");
        
        thread1.start();
        thread2.start();
    }
}

这里需要注意,Thread.yield方法并不会抛出异常,当然也就不需要对任何的异常进行处理,当线程调用了yield方法之后,线程不会进入阻塞状态,而是进入就绪状态(Ready/Runnable),JVM可能会立刻重新调度当前线程继续执行,也可能让出CPU交给其他线程来使用。

区别和联系

比较维度

Thread.sleep

Thread.yield

作用

让当前线程暂停一段时间(毫秒/纳秒),进入阻塞状态。

让当前线程主动放弃 CPU 使用权,进入就绪状态。

是否保证让出 CPU

是,当前线程会进入阻塞状态,其他线程有机会获得 CPU。

不保证,让出 CPU 仅为建议,可能立刻重新调度当前线程执行。

常见用途

实现延时、控制线程速度、模拟定时任务等。

调整线程执行顺序,避免线程长时间占用 CPU。

线程状态

阻塞状态 (Blocked)。

就绪状态 (Ready/Runnable)。

异常处理

需要处理

InterruptedException

不需要异常处理。

锁的影响

保持原有锁。

保持原有锁。

总结

二者都属于Thread类的静态方法,用于控制线程执行状态。Thread.sleep会使线程进入阻塞状态,而Thread.yield 则不会进入阻塞状态,而是让当前线程回到就绪状态。当线程进入阻塞状态之后,在指定的时间结束后才能恢复到可运行状态,因此通常用于固定时间的延迟操作。而当线程进入到就绪状态之后,是否重新获得执行权由JVM决定,因此它更适合调节线程执行顺序而不是实现延时。

在实际应用中,Thread.sleep用于控制时间的暂停,而Thread.yield更适合帮助多线程环境下调度线程执行顺序。

相关推荐

.NET 奇葩问题调试经历之3——使用了grpc通讯类库后,内存一直增长......

...

全局和隐式 using 指令详解(全局命令)

1.什么是全局和隐式using?在.NET6及更高版本中,Microsoft引入了...

请停止微服务,做好单体的模块化才是王道:Spring Modulith介绍

1、介绍模块化单体是一种架构风格,代码是根据模块的概念构成的。对于许多组织而言,模块化单体可能是一个很好的选择。它有助于保持一定程度的独立性,这有助于我们在需要的时候轻松过渡到微服务架构。Spri...

ASP.NET程序集引用之痛:版本冲突、依赖地狱等解析与实战

我是一位多年后端经验的工程师,其中前几年用ASP.NET...

.NET AOT 详解(.net 6 aot)

简介AOT(Ahead-Of-TimeCompilation)是一种将代码直接编译为机器码的技术,与传统的...

一款基于Yii2开发的免费商城系统(一款基于yii2开发的免费商城系统是什么)

哈喽,我是老鱼,一名致力于在技术道路上的终身学习者、实践者、分享者!...

asar归档解包(游戏arc文件解包)

要学习Electron逆向,首先要有一个Electron开发的程序的发布的包,这里就以其官方的electron-quick-start作为例子来进行一下逆向的过程。...

在PyCharm 中免费集成Amazon CodeWhisperer

CodeWhisperer是Amazon发布的一款免费的AI编程辅助小工具,可在你的集成开发环境(IDE)中生成实时单行或全函数代码建议,帮助你快速构建软件。简单来说,AmazonCodeWhi...

2014年最优秀JavaScript编辑器大盘点

1.WebstormWebStorm是一种轻量级的、功能强大的IDE,为Node.js复杂的客户端开发和服务器端开发提供完美的解决方案。WebStorm的智能代码编辑器支持JavaScript,...

基于springboot、tio、oauth2.0前端vuede 超轻量级聊天软件分享

项目简介:基于JS的超轻量级聊天软件。前端:vue、iview、electron实现的PC桌面版聊天程序,主要适用于私有云项目内部聊天,企业内部管理通讯等功能,主要通讯协议websocket。支持...

JetBrains Toolbox推出全新产品订阅授权模式

捷克知名软件开发公司JetBrains最为人所熟知的产品是Java编程语言开发撰写时所用的集成开发环境IntelliJIDEA,相信很多开发者都有所了解。而近期自2015年11月2日起,JetBr...

idea最新激活jetbrains-agent.jar包,亲测有效

这里分享一个2019.3.3版本的jetbrains-agent.jar,亲测有效,在网上找了很多都不能使用,终于找到一个可以使用的了,这里分享一下具体激活步骤,此方法适用于Jebrains家所有产品...

CountDownTimer的理解(countdowntomars)

CountDownTimer是android开发常用的计时类,按照注释中的说明使用方法如下:kotlin:object:CountDownTimer(30000,1000){...

反射为什么性能会很慢?(反射时为什么会越来越长)

1.背景前段时间维护一个5、6年前的项目,项目总是在某些功能使用上不尽人意,性能上总是差一些,仔细过了一下代码发现使用了不少封装好的工具类,工具类里面用了好多的反射,反射会影响到执行效率吗?盲猜了一...

btrace 开源!基于 Systrace 高性能 Trace 工具

介绍btrace(又名RheaTrace)是抖音基础技术团队自研的一款高性能AndroidTrace工具,它基于Systrace实现,并针对Systrace不足之处加以改进,核心改进...

取消回复欢迎 发表评论: