首页 > 其他分享 >【线程基础】【五】yield、sleep、wait方法的异同

【线程基础】【五】yield、sleep、wait方法的异同

时间:2023-04-18 22:12:32浏览次数:35  
标签:调用 yield sleep 线程 方法 wait

1  前言

本节我们讲下Thread.yield()方法的作用,并对比下sleep()方法、wait()方法,看看三者有何区别。

2  yield 方法

作用是:提出释放CPU时间片的请求,不会释放锁,主要知道它不会阻塞线程即可哈,平时我是没怎么用过哈。
特点就是:
(1)yield()方法只是提出申请释放CPU资源,至于能否成功释放由JVM决定。
(2)调用了yield()方法后,线程依然处于RUNNABLE状态,线程不会进入堵塞状态。
(3)调用了yield()方法后,线程处于RUNNABLE状态时,线程就保留了随时被调度的权利。

3  yield 方法与 sleep 方法的区别

yield()方法调用后线程处于RUNNABLE状态,而sleep()方法调用后线程处于TIME_WAITING状态,所以yield()方法调用后线程只是暂时的将调度权让给别人,但立刻可以回到竞争线程锁的状态;而sleep()方法调用后线程处于阻塞状态。

4  sleep 方法与 wait 方法的区别

sleep()方法的特点就是:(1)使线程进入WAITING状态(2)不会占用CPU资源(3)不释放锁(4)响应中断
那么跟 wait 方法的异同点:
相同点:(1)都可以使阻塞线程(2)都可以响应中断
不同点:
(1)wait()notify()方法必须写在同步方法中,是为了防止死锁和永久等待,使线程更安全,而sleep()方法不需要有这个限制。
(2)wait()方法调用后会释放锁sleep()方法调用后不会释放锁。
(3)sleep()方法必须要指定时间参数;wait()方法可以不指定时间参数。
(4)两个方法所属类不同,sleep()方法属于Thread类;wait()属于Object类中,放在Object类中是因为Java中每个类都可以是一把锁。

5  小结

本节简单介绍了下yield方法,以及和sleep、wait方法的区别,主要是理解状态的转变以及锁的释放哈,有理解不对的地方欢迎指正哈。

标签:调用,yield,sleep,线程,方法,wait
From: https://www.cnblogs.com/kukuxjx/p/17328217.html

相关文章

  • 【线程基础】【二】线程的状态流转
    1 前言上节我们看了线程是如何创建启动的,那么启动以后线程怎么管理呢,这就要看我们线程的状态管理了,这节我们就来看看线程都有哪些状态以及什么操作下会驱使状态的变化流转。2 状态定义Java线程有6种状态定义在Thread的子类State,分别是NEW、RUNNABLE、BLOCKED、WAITING、TIM......
  • 【线程基础】【一】线程的创建方式
    1 前言本节开始我们来回顾下线程基础相关的东西,最近在复习所以来做一些笔记哈,这节我们来讲讲创建线程的方式。2 创建分类Java提供了两种线程的创建方法,第一种是继承Thread类;第二种是实现Runable接口,并将Runnable实例传递给Thread类。详细的可以参考官方文档哈:https://docs.......
  • 进程上下文切换、线程上下文切换、中断上下文切换的区别
    概念​CPU上下文切换指的是CPU从一个进程或线程切换到另一个进程或线程的次数。当CPU执行一个进程或线程时,会为其建立一个执行上下文(Context),当CPU切换到另一个进程或线程时,需要保存当前的上下文并建立新的上下文,这个过程就是上下文切换。​上下文切换会......
  • 基于LINUX系统下多线程贪吃蛇小游戏
    基于Ncurse图形库的C语言小游戏。涉及到,C变量,流程控制,函数,指针,结构体等知识内容,动态链表的创建和插入,以及释放。数组的遍历,#include<stdlib.h>#include<curses.h>#defineROW20#defineCOL20#defineROW_Snake2#defineCOL_Snake2#defineUP1#defineDOWN......
  • 一个Java线程的线生(线生 vs 人生)
    java线程的使用1.Java多线程概述下面我们看下Java的多线程作者:博学谷狂野架构师GitHub:GitHub地址(有我精心准备的130本电子书PDF)只分享干货、不吹水,让我们一起加油!......
  • Qt多线程之QMutex
    QMutex同一个QMutexlock()时,其他的lock()操作要等待locked的地方unlock()(可以保证顺序执行)测试代码:#include<iostream>#include<QThread>#include<QMutex>usingnamespacestd;classmyThread1:publicQThread{public:myThread1(int&num,QMutex&......
  • 线程委任出现冲突
    当我们在C#中编写委托事件进行传递参数来改变对象属性时,容易引起另一个线程拥有该对象的现象,这是线程之间的关联问题,要想解决此问题,我们就要将委托回来的线程对象和当前函数中的线程对象相关联。//将出现问题的代码放在此函数中Dispatcher.Invoke(newAction(......
  • asp.net signalR 专题—— 第三篇 如何从外部线程访问 PersistentConnection
       在前面的两篇文章中,我们讲到的都是如何将消息从server推向client,又或者是client再推向server,貌似这样的逻辑没什么异常,但是放在真实的环境中,你会很快发现有一个新需求,如何根据第三方系统的数据变化来即时的将新数据推送到各个客户端,比如下面这样:ok,原理就是上面的这......
  • 使用Task的一些知识优化了一下同事的多线程协作取消的一串代码
    最近在看一个同事的代码,代码的本意是在main方法中开启10个线程,用这10个线程来处理一批业务逻辑,在某一时刻当你命令console退出的时候,这个时候不是立即让console退出,而是需要等待10个线程把检测状态之后的业务逻辑执行完之后再退出,这样做是有道理的,如果强......
  • 同步异步多线程这三者关系,你能给面试官一个满意的回答吗?
    前几天一位朋友去面试,面试官问了他同步,异步,多线程之间是什么关系,异步比同步高效在哪?多线程比单线程高效在哪?由于回答的不好,让我帮他捋一下,其实回答这个问题不难,难就难在只对别人说理论,而没有现杀的例子。一:异步1.到底解放了谁?<1>从基础的同步说起要说解放了谁,一定得有几......