多线程-线程让步(yield)

线程的让位(Yield) 线程的让位(Yield)是指当前正在执行的线程主动让出CPU资源,使其他线程有机会运行。在Java中,通过Thread.yield()方法实现,但实际效果依赖操作系统调度,并不保证其他线程一定优先执行。 阅读详情

1. yield()介绍

yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!

 

2. yield()示例

下面,通过示例查看它的用法。

  // YieldTest.java的源码
  class ThreadA extends Thread{
      public ThreadA(String name){ 
          super(name); 
      } 
      public synchronized void run(){ 
          for(int i=0; i <10; i++){ 
              System.out.printf("%s [%d]:%d\n", this.getName(), this.getPriority(), i); 
              // i整除4时,调用yield
             if (i%4 == 0)
                 Thread.yield();
         } 
     } 
 } 
 
 public class YieldTest{ 
     public static void main(String[] args){ 
         ThreadA t1 = new ThreadA("t1"); 
         ThreadA t2 = new ThreadA("t2"); 
         t1.start(); 
         t2.start();
     } 
 } 

 

(某一次的)运行结果:

t1 [5]:0
t2 [5]:0
t1 [5]:1
t1 [5]:2
t1 [5]:3
t1 [5]:4
t1 [5]:5
t1 [5]:6
t1 [5]:7
t1 [5]:8
t1 [5]:9
t2 [5]:1
t2 [5]:2
t2 [5]:3
t2 [5]:4
t2 [5]:5
t2 [5]:6
t2 [5]:7
t2 [5]:8
t2 [5]:9
 

结果说明:
“线程t1”在能被4整数的时候,并没有切换到“线程t2”。这表明,yield()虽然可以让线程由“运行状态”进入到“就绪状态”;但是,它不一定会让其它线程获取CPU执行权(即,其它线程进入到“运行状态”),即使这个“其它线程”与当前调用yield()的线程具有相同的优先级。

 

3. yield() 与 wait()的比较

我们知道,wait()的作用是让当前线程由“运行状态”进入“等待(阻塞)状态”的同时,也会释放同步锁。而yield()的作用是让步,它也会让当前线程离开“运行状态”。它们的区别是:
(01) wait()是让线程由“运行状态”进入到“等待(阻塞)状态”,而不yield()是让线程由“运行状态”进入到“就绪状态”。
(02) wait()是会线程释放它所持有对象的同步锁,而yield()方法不会释放锁。

下面通过示例演示yield()是不会释放锁的。

  // YieldLockTest.java 的源码
  public class YieldLockTest{ 
  
      private static Object obj = new Object();
  
      public static void main(String[] args){ 
          ThreadA t1 = new ThreadA("t1"); 
          ThreadA t2 = new ThreadA("t2"); 
          t1.start(); 
         t2.start();
     } 
 
     static class ThreadA extends Thread{
         public ThreadA(String name){ 
             super(name); 
         } 
         public void run(){ 
             // 获取obj对象的同步锁
             synchronized (obj) {
                 for(int i=0; i <10; i++){ 
                     System.out.printf("%s [%d]:%d\n", this.getName(), this.getPriority(), i); 
                     // i整除4时,调用yield
                     if (i%4 == 0)
                         Thread.yield();
                 }
             }
         } 
     } 
 } 
 

(某一次)运行结果:

t1 [5]:0
t1 [5]:1
t1 [5]:2
t1 [5]:3
t1 [5]:4
t1 [5]:5
t1 [5]:6
t1 [5]:7
t1 [5]:8
t1 [5]:9
t2 [5]:0
t2 [5]:1
t2 [5]:2
t2 [5]:3
t2 [5]:4
t2 [5]:5
t2 [5]:6
t2 [5]:7
t2 [5]:8
t2 [5]:9
 

结果说明:
主线程main中启动了两个线程t1和t2。t1和t2在run()会引用同一个对象的同步锁,即synchronized(obj)。在t1运行过程中,虽然它会调用Thread.yield();但是,t2是不会获取cpu执行权的。因为,t1并没有释放“obj所持有的同步锁”!

线程 yield()方法有什么用? 方法的主要作用是让出当前线程的 CPU 时间片,使得其他具有相同优先级的线程有机会运行。它并不会阻止当前线程立即进入就绪状态,而只是告诉调度器,当前线程可以放弃一部分执行时间,让其他线程有机会运行。可能会导致线程切换的开销增加,影响性能,因此应谨慎使用,通常在确实有特定需求时才使用它。方法的效果在不同的操作系统和 JVM 实现上可能会有一些差异,因此它不能用于编写可移植的多线程代码。调度控制:在某些情况下,程序员可能需要精确地控制线程的执行顺序,使用。类的一个方法,用于在多线程编程中控制线程的执行。 阅读详情

相关推荐

【JAVA】-- 多线程(线程让步yield、线程插队join)

一、线程让步 线程让步是指正在执行的线程,在某些情况下将CPU资源让给其他线程执行。 可通过yield()方法来实现。 该方法和sleep()方法有点相似,都可以让当前正在运行的线程暂停,区别在于yield()方法不会阻塞该线程,只是将线程转换成就绪状态,让系统调度器重新调度一次。 只有与当前线程优先级相同或者更高的线程才能获得执行的机会。 使用示例: class YieldThread extends Thread{ public YieldThread(String name){

个人博客 1276

多线程之yield()方法

一:简介 简介 Thread.yield()方法作用是:暂停当前正在执行的线程对象(及放弃当前拥有的cup资源), 并执行其他线程。yield()做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其 他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调...

花&败 2万+

QGIS三维地形可视化实战:从DEM数据到炫酷3D场景(附Qgis2threejs插件配置)

本文详细介绍了如何利用QGIS和Qgis2threejs插件,将DEM数据转化为交互式三维地形场景的完整工作流。核心内容包括DEM数据准备、坐标系选择(重点对比WGS 84与UTM的差异及影响)、插件核心参数配置、卫星影像与等高线叠加等进阶技巧,并提供了成果导出与常见问题解决方案,帮助用户高效创建可用于网页展示的炫酷3D可视化成果。

mqtt6iot的博客 877

sleep()和yield()有什么区别?

sleep() 方法给其他线程运行机会时不考虑线程的优先级;yield() 方法只会给相同优先级或更高优先级的线程运行的机会 线程执行 sleep() 方法后进入阻塞状态;线程执行 yield() 方法转入就绪状态,可能马上又得得到执行 sleep() 方法声明抛出 InterruptedException;yield() 方法没有声明抛出异常 sleep() 方法需要指定时间参数;yiel...

ConstXiong 1110

BSW:MemMap模块配置及使用

(内存映射(MemMap)模块用于通过内存映射文件将代码和数据映射到特定的内存部分。MemMap生成特定的头文件,其中包含为MemorySection元素和编译器特定指令定义的内存映射预处理器。上面是比较官方的回答,说人话就是把数据和代码放在ECU内指定的地址。初级应用:软件中的bss,data,rodata,code,text,段需要在memory layout中划分具体的物理地址,对于多核系统,要将执行的数据和代码放在目标核的RAM和ROM。

Forever_Oct的博客 3679

VC Spyglass调试秘籍:从Lint报错到代码修复的完整工作流

本文详细介绍了VC Spyglass调试的完整工作流,重点解析了如何高效定位和修复Lint检查中常见的XMRE-L跨模块引用错误。通过对比GUI与命令行(vc_static_shell)双模式调试技巧,并结合TCL脚本实现批量处理与规则豁免,帮助数字设计工程师系统化地提升代码调试效率与质量。

weixin_29246195的博客 585

线程中run()方法和start()方法区别,为什么在调用start()时,会执行run()方法

1.线程中run()方法和start()方法区别 run方法是线程中的一个普通方法体,可以重复调用。是线程里的一个函数,不是多线程,直接调用run方法,相当于调用一个普通函数,执行路径还是一条, 根本没有多线程的特征。 而start方法是Thread中的线程启动方法,只能调用一次,且调用之后,线程就是就绪状态,时间片获取之后即可执行run方法中的内容。 start方法来启动一个线程,真正实现了多线程运算,调用start方法无需等待run方法运行完成,可以直接继续执行其他代码;run方法执行完毕,线程终止,然

JIESHAO优快云的博客 1193

Buck-Boost电路

前面我们学习了降压的Buck电路 (左图) 和升压的Boost电路 (右图),那么如果我们把Buck电路和Boost电路结合一下会发生什么情况? 我们尝试着画一下: 我们用Buck电路作为输入,然后用Boost电路进行调整,最后输出。因此Buck电路中的负载、Boost电路的电源都可以删掉。得到下图: 由于Buck电路中的C2的作用是在输出的时候滤波,这个功能已经由Boost电路中的C1实现了,因此可以删除Buck电路中的C2电容。得到下图: 这里两个电感处于串联状态,可以合二为一,得到下面的电路:

wangeil007的博客 4万+

java多线程yield_java多线程笔记之让步yield例子

java多线程以前介绍过很多这类文章了,下面我看了月小升博客写的一篇关于多线程让步yield例子了,下面一聚教程小编就来给各位转过来,希望例子对各位会带一帮助。先看个yield让步的例子 代码如下 复制代码 package com.javaer.thread;public class YThread implements Runnable {private Ob...

weixin_42505462的博客 228

超详细YOLOv8姿态检测全程概述:环境、训练、验证与预测详解

本篇博客详细介绍了使用YOLOv8-pose进行姿态估计的全过程,包括不同版本模型的性能比较、训练与验证步骤,以及预测代码的实现。它对模型参数、训练过程和输出结果进行了解释,同时提供了详细的配置文件示例和标签数据格式说明。此外,还演示了如何使用预训练模型进行图像预测,并如何处理和理解预测结果。最后,它还讨论了如何评估和比较不同模型的性能。如果有哪里写的不够清晰,小伙伴本可以给评论或者留言,我这边会尽快的优化博文内容,另外如有需要,我这边可支持技术答疑与支持。

CDBmax的博客 3万+

AnolisOS网卡驱动源码编译与安装实战指南

本文提供了一份详尽的AnolisOS网卡驱动源码编译与安装实战指南。针对系统自带通用驱动不兼容导致网络无法使用的问题,文章从环境准备、源码获取、编译安装到新旧驱动替换与持久化配置,一步步解析了如何通过源码编译安装官方驱动,解决硬件兼容性问题,并确保驱动在系统重启后自动生效。

weixin_28358083的博客 307

Java多线程-yield()线程让步

一)yield()简介 static voidyield():使当前正在运行的线程对象暂停,并执行其它线程。 线程让步:调用Thread.yield()方法时,暂停当前正在运行的线程对象,并执行其它相同或优先级别更高的线程。 使用目的:使用yield()方法目的是让具体相同优先级别的线程轮询​执行,但实际中无法保证yield达到让步的目的,因为让步的线程可能再次被线程调度器选中继续运...

p812438109的专栏 1174

C# 操作Excel的时候,出现"被呼叫方拒绝接受呼叫的异常"的解决方案(参考官方给出的解决方案)

首先官方有对这个错误给出解释和解决方案,连接如下: https://docs.microsoft.com/zh-cn/previous-versions/ms228772(v=vs.120)#%E5%8F%AF%E9%9D%A0%E7%BC%96%E7%A8%8B 简单来说,貌似是线程问题,我猜。。。 之前我尝试着在代码中添加 Thread.Sleep(1000); 来进行解决,这种办...

Ck_Max的博客 5770

java多线程系列 ——(3)yield()线程让步

1.yield()介绍 yield()方法是Thread类提供的方法,它的作用是线程让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行! 2.yield()示例 public class YieldTest {...

BodyCoding 358

【ROS】ROS2导航Nav2:简介、安装、测试效果、错误处理

在ROS2中自动导航使用Nav2来实现。Nav2 使用几个独立的模块化服务,通过 ROS 2接口(例如动作服务器或服务)与行为树 (BT) 通信。Nav2 输入包括:TF转换、一个地图源、一个行为树 (BT) XML 文件和相关的传感器数据源;Nav2 输出速度命令;Nav2 支持多种机器人,比如:四足机器人、履带机器人、轮式机器人等。

郭老二 5090

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

yield方法释放锁吗_java多线程,让步yield

发表于 2014-07-02 10:22:36 by 月小升[seriesposts sid=500]package com.javaer.thread;public class YThread implements Runnable {private Object obj = new Object();/*** @param args*/public static void main(Stri...

weixin_36091052的博客 552

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java多线程学习笔记(三)休眠(sleep),让步(yield),插队(join)

线程休眠:使用Thread.sleep(long millis)可以使线程休眠,也就是将正在执行的线程暂停,将CPU让给其他线程去执行。 实例: public class Example06 { public static void main(String[] args) { SleepThread sleepThread = new SleepThread(); new Thread(sleepThread,"线程A

记录学习JAVA中的点点滴滴 333

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【多线程 - 06、线程优先级与线程让步 yield】

每个线程在执行时都具有一定的优先级,优先级高的线程获得较多的执行机会,而优先级低的线程则获得较少的执行机会

qq_46023503的博客 347

【JAVA多线程13】线程基本方法-线程让步(yield)

Thread.yield()方法的作用:暂停当前正在执行的线程,并执行其他线程。(可能没有效果) yield()让当前正在运行的线程回到可运行状态,以允许具有相同优先级的其他线程获得运行的机会。因此,使用yield()的目的是让具有相同优先级的线程之间能够适当的轮换执行。但是,实际中无法保证yield()达到让步的目的,因为,让步的线程可能被线程调度程序再次选中。 结论:大多数情况下,yiel...

dcm19920115的博客 338

Java多线程六:线程优先级和yield()让步函数

可以看出,不管优先级和yield()函数都是试图控制线程的顺序执行.但是我们需要注意的一点是,在java中没有任何机制可以保证线程的执行顺序,两种做法只不过是增加了线程之间切换的几率而已.,

小鱼儿的专栏 4205

线程的让入与阻塞——让步yield,阻塞join语句

线程的让步与阻塞 1,线程的让步语句 Thread.yield();,设置条件,符合此条件后,线程让步执行其他程序,几个程序重新争取CPU, if(i%5==0)             {             Thread.yield();//线程的让步             }   2,线程的阻塞 阻塞和睡眠基本一致,不过将try中的Thread.sleep(100)换成...

weixin_42613513的博客 882

[Java并发与多线程](八)线程让步

Java多线程之线程让步1、yield()介绍2、yield()示例3、yield() 与 wait()的比较 1、yield()介绍 yield()的作用是让步。它能然当前线程由运行状态进入到就绪状态,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到运行状态继续执行! 2、yie...

xujunson的博客 313

控制线程---线程让步:yield

confirmAname的专栏 615

Java多线程Day06-多线程之线程让步

线程让步基本概念yield()与wait()比较相同点不同点 基本概念 yield() 的作用: 线程让步 可以让当前线程由 [运行状态] 进入到 [就绪状态] 从而让其余具有相同优先级的 [等待线程] 获得执行权 不能保证在当前线程调用yield() 之后,其余具有相同优先级的 [等待线程] 就一定能获得执行权.因为当前线程可能又会进入到 [运行状态] 继续运行 yield()与wait()比较 线程让步之后,并不会释放锁.因此,其余线程也没机会获得锁,只能是当前线程执行完之后,才会释放对象的

攻城狮Chova的博客 437

Java——线程让步_yield()方法

线程让步可以通过 yield ()方法来实现,该方法和 sleep ()方法有点相似,都可以让当前正在运行的线程暂停,区别在于 yield() 方法不会阻塞该线程,它只是将线程转换成就绪状态,让系统的调度器重新调度一次。当某个线程调用 yield ()方法之后,只有与当前线程优先级相同或者更高的线程才能获得执行的机会。 ExampleM09: //线程让步 //定义 YieldThread 类继承 Thread 类 class YieldThread extends Thread { //定义一个有

XQC_KKK的博客 880

多线程 sleep,yield,join

jdk 中yield方法注释翻译: 提示调度程序当前线程愿意放弃当前对处理器的使用。调度程序可以忽略这个提示。 Yield是一种启发式尝试,旨在改善线程之间的相对进展,否则线程将过度使用CPU。它的使用应该与详细的分析和基准测试结合起来,以确保它实际上具有预期的效果。 很少使用这种方法。对于调试或测试目的,它可能会很有用,因为它可以帮助再现由于竞争条件而产生的bug。在设计诸如{@link java.util.concurrent中的并发控制结构时,它可能也很有用。锁}包 yield: 在多个线程执

lxwfly的博客 251
上一篇: 多线程-线程等待与唤醒
下一篇: 多线程-线程休眠(sleep)
Mark_XC
博客等级 码龄9年 16粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值