06. 多线程 yield 方法

1. 前言

本节对 yield 方法进行深入的剖析,主要内容点如下:

  • 首先要了解什么是 CPU 执行权,因为 yield 方法与 CPU 执行权息息相关;
  • 了解 yield 方法的作用,要明确 yield 方法的使用所带来的运行效果;
  • 了解什么是 native 方法,由于 yield 方法是 native 方法的调用,在学习 yield 方法之前,要了解什么是 native 方法;
  • 掌握 yield 方法如何使用,这是本节知识点的重中之重,一定要着重学习;
  • 了解 yield 方法和 sleep 方法的区别,进行对比记忆,更有助于掌握该方法的独有特性。

2. 什么是 CPU 执行权

我们知道操作系统是为每个线程分配一个时间片来占有 CPU 的,正常情况下当一个线程把分配给自己的时间片使用完后,线程调度器才会进行下一轮的线程调度,这里所说的 “自己占有的时间片” 即 CPU 分配给线程的执行权。

那进一步进行探究,何为让出 CPU 执行权呢?
当一个线程通过某种可行的方式向操作系统提出让出 CPU 执行权时,就是在告诉线程调度器自己占有的时间片中还没有使用完的部分自己不想使用了,主动放弃剩余的时间片,并在合适的情况下,重新获取新的执行时间片。

3. yield 方法的作用

方法介绍:Thread 类中有一个静态的 yield 方法,当一个线程调用 yield 方法时,实际就是在暗示线程调度器当前线程请求让出自己的 CPU 使用权。

public static native void yield();

Tips:从这个源码中我们能够看到如下两点要点:

  1. yield 方法是一个静态方法,静态方法的特点是可以由类直接进行调用,而不需要进行对象 new 的创建,调用方式为 Thread.yield ()。
  2. 该方法除了被 static 修饰,还被 native 修饰,那么进入主题,什么是 native 方法呢?我们继续来看下文的讲解。

抽象地讲,一个 Native Method 就是一个 Java 调用的非 Java 代码的接口。一个 Native Method 是这样一个 Java 的方法:该方法的实现由非 java 语言实现。

简单的来说,native 方法就是我们自己电脑的方法接口,比如 Windows 电脑会提供一个 yield 方法,Linux 系统的电脑也同样会提供一个 yield 方法,本地方法,可以理解为操作调用操作系统的方法接口。

作用:暂停当前正在执行的线程对象(及放弃当前拥有的 cup 资源),并执行其他线程。yield () 做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。

目的:yield 即 “谦让”,使用 yield () 的目的是让具有相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证 yield () 达到谦让目的,因为放弃 CPU 执行权的线程还有可能被线程调度程序再次选中。

4. yield 方法如何使用

为了更好的了解 yield 方法的使用,我们首先来设计一个使用的场景。
场景设计

  • 创建一个线程,线程名为 threadOne;
  • 打印一个数,该数的值为从 1 加到 10000000 的和;
  • 不使用 yield 方法正常执行,记录总的执行时间;
  • 加入 yield 方法,再次执行程序;
  • 再次记录总执行时间。

期望结果: 未加入 yield 方法之前打印的时间 < 加入 yield 方法之后的打印时间。因为 yield 方法在执行过程中会放弃 CPU 执行权并从新获取新的 CPU 执行权。

代码实现 - 正常执行

public class DemoTest extends Thread {@Overridepublic void run() {Long start = System.currentTimeMillis();int count = 0;for (int i = 1; i <= 10000000; i++) {count = count + i;}Long end = System.currentTimeMillis();System.out.println("总执行时间: "+ (end-start) + " 毫秒, 结果 count = " + count);}public static void main(String[] args) throws InterruptedException {DemoTest threadOne = new DemoTest();threadOne. start();}
}

执行结果验证

总执行时间: 6 毫秒. 

代码实现 - yield 执行

public class DemoTest extends Thread {@Overridepublic void run() {Long start = System.currentTimeMillis();int count = 0;for (int i = 1; i <= 10000000; i++) {count = count + i;this.yield(); // 加入 yield 方法}Long end = System.currentTimeMillis();System.out.println("总执行时间: "+ (end-start) + " 毫秒. ");}public static void main(String[] args) throws InterruptedException {DemoTest threadOne = new DemoTest();threadOne. start();}
}

执行结果验证

总执行时间: 5377 毫秒. 

从执行的结果来看,与我们对 yield 方法的理解和分析完全相符,请同学也进行代码的编写和运行,加深学习印象。当加入 yield 方法执行时,线程会放弃 CPU 的执行权,并等待再次获取新的执行权,所以执行时间上会更加的长。

5. yield 方法和 sleep 方法的区别

  • sleep () 方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;
  • yield () 方法只会给相同优先级或更高优先级的线程以运行的机会;
  • 线程执行 sleep () 方法后转入阻塞 (blocked) 状态,而执行 yield () 方法后转入就绪 (ready) 状态;
  • sleep () 方法声明会抛出 InterruptedException, 而 yield () 方法没有声明任何异常;
  • sleep () 方法比 yield () 方法具有更好的移植性 (跟操作系统 CPU 调度相关)。

6. 小结

在实际的开发场景中,yield 方法的使用场景比较少,但是对于并发原理知识的学习过程,对 yield 方法的了解非常重要,有助于同学了解不同状态下的线程的不同状态。
本节要重点掌握 yield 方法的作用以及如何使用 yield 方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/856777.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简述http/https、tcp/ip、SSL/TLS介绍

HTTP/HTTPS、TCP和IP之间的区别主要体现在它们的作用层次、功能特点以及在网络通信中的角色。 一. 作用层次&#xff1a; HTTP/HTTPS&#xff1a;HTTP&#xff08;Hyper Text Transfer Protocol&#xff0c;超文本传输协议&#xff09;和HTTPS&#xff08;HTTP Secure&#x…

跨区域文件管控解决方案,一文了解

跨区域文件管控是一个涉及在不同地域或区域之间管理和控制文件的过程&#xff0c;它包括安全性、合规性和管理效率等多个方面。以下是一些关键的考量因素&#xff1a; 1.安全性&#xff1a;确保在传输过程中文件不被截获、篡改或泄露。使用加密技术保护文件&#xff0c;并确保传…

云呼叫中心系统能帮企业做哪些事?

在云计算时代大环境的影响&#xff0c;各大企业也都企图将云计算融入企业业务中&#xff0c;智能化不只可以提高企业产能、提高服务效率&#xff0c;更能发掘更高的品牌价值。云计算不断深入企业内部&#xff0c;尤其在劳动密集型的产业中&#xff0c;优势更加明显。以电销为例…

mysql 慢sql优化记录

最近在分析一条SQL&#xff0c;这条SQL执行时间去到2秒以上。SQL如下&#xff1a; selectcount(d.id) fromt_msg d whered.userid12456 and d.isread0 AND d.msgnumber<> NEW-JCPT003 表上索引有 idx_userid(userid)&#xff0c;这条SQL是一条比较标准的统计…

【初阶数据结构】深入解析带头双向循环链表:探索底层逻辑

&#x1f525;引言 本篇将介绍带头双向循环链表底层实现以及在实现中需要注意的事项&#xff0c;帮助各位在使用过程中根据底层实现考虑到效率上问题和使用时可能会导致的错误使用 &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔…

昇腾Ascend C算子开发

Ascend C的算子实现主要包含两个部分&#xff1a; ● Host侧Tiling实现 由于NPU中AI Core内部存储无法完全容纳算子输入输出的所有数据&#xff0c;需要每次搬 运一部分输入数据进行计算然后搬出&#xff0c;再搬运下一部分输入数据进行计算&#xff0c;这个 过程就称之为Tilin…

C#使用NPOI库实现Excel的导入导出操作——提升数据处理效率的利器

文章目录 一、NPOI库简介二、安装与引入三、Excel的导入操作1.CSV格式导入2.XLS格式导入3. XLSX格式导入 四、Excel的导出操作1. CSV格式导出2. XLS格式导出3. XLSX格式导出 五、NPOI库的应用优势与改进方向总结 在日常工作学习中&#xff0c;我们经常需要处理Excel文件&#x…

AIX小机环境如何给ASM添加磁盘

前面几篇介绍了HPUX,Solaris平台上RAC集群ASM如何添加磁盘的 &#xff0c;三大UNIX平台只差AIX&#xff0c;本文介绍AIX平台RAC 添加ASM磁盘 environment&#xff1a; AIX 6.1 oracle 10.0.2.4 2 nodes RAC (storage HP-6100 FC disk) 1. 存储划盘&#xff0c;并将盘赋予…

[Day 16] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

計算機視覺技術在AI中的應用 簡介 計算機視覺&#xff08;Computer Vision&#xff0c;CV&#xff09;是人工智能&#xff08;AI&#xff09;中一個重要且快速發展的領域&#xff0c;它使得機器能夠理解和解釋視覺信息。隨著硬件計算能力的提升和深度學習方法的興起&#xff…

紫光展锐芯片进入烧录模式

实验平台&#xff1a;移远通信SC200L搭载SMART-EVB-G5开发板 软件进入&#xff1a; SPRD平台芯片可以通过adb进入fastboot模式&#xff0c;由fastboot flash boot等指令烧录&#xff1a; $ adb root $ adb reboot fastboot $ fastboot flash boot boot.img 由于usb传输一般都…

探索 Spring Boot 集成缓存功能的最佳实践

在线工具站 推荐一个程序员在线工具站&#xff1a;程序员常用工具&#xff08;http://cxytools.com&#xff09;&#xff0c;有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具&#xff0c;效率加倍嘎嘎好用。 程序员资料站 推荐一个程序员编程资料站&#xff1a;…

《单元测试之道Java版——使用JUnit》学习笔记汇总

前言 主要用来记录《单元测试之道Java版——使用JUnit》书中的一些必要知识&#xff0c;方便后期编程使用。 目录 序言你的首个单元测试使用Junit编写测试测试哪些内容&#xff1a;Right-BICEPCORRECT边界条件使用Mock对象好的测试所具有的品质在项目中进行测试设计话题 后…

使用kibana创建索引的时候报错处理

报错信息&#xff1a;The index pattern youve entered doesnt match any indices. You can match your 1 index, below. 使用kibana创建索引的时候&#xff0c;无法进行下一步创建操作&#xff0c;出现这种情况有很多种情况&#xff0c;每个人遇到的问题会不一样。 第一种&am…

python基础篇(3):print()补偿知识点

1 print输出不换行 默认print语句输出内容会自动换行&#xff0c;如下&#xff1a; print("hello") print(" world") 结果&#xff1a; 在print语句中&#xff0c;加上 end’’ 即可输出不换行了 print("hello",end) print(" world&quo…

Java | Leetcode Java题解之第171题Excel表列序号

题目&#xff1a; 题解&#xff1a; class Solution {public int titleToNumber(String columnTitle) {int number 0;int multiple 1;for (int i columnTitle.length() - 1; i > 0; i--) {int k columnTitle.charAt(i) - A 1;number k * multiple;multiple * 26;}ret…

Python重力弹弓流体晃动微分方程模型和交直流电阻电容电路

&#x1f3af;要点 &#x1f3af;计算地球大气层中热层金属坠物运动轨迹 | &#x1f3af;计算炮弹最佳弹射角度耦合微分方程 | &#x1f3af;计算电磁拉莫尔半径螺旋运动 | &#x1f3af;计算航天器重力弹弓运动力学微分方程 | &#x1f3af;计算双摆的混沌运动非线性微分方程…

哈尔滨金融行业安全的坚固基石:等保测评的作用

在信息化与数字化的浪潮下&#xff0c;金融行业面临着前所未有的挑战与机遇。哈尔滨&#xff0c;作为东北地区重要的金融中心&#xff0c;其金融行业的信息安全直接关系到区域经济的稳定与发展。在此背景下&#xff0c;信息安全等级保护测评&#xff08;简称“等保测评”&#…

前端查询后矩阵的和

// 创建一个 n x n 的二维数组并初始化为 0 function createMatrix(n) {// 创建一个长度为 n 的数组let matrix new Array(n);// 遍历数组&#xff0c;将每个元素设为长度为 n 的新数组&#xff0c;并初始化所有值为 0for(let i 0; i < n; i) {matrix[i] new Array(n).fi…

深入了解.mkp勒索病毒:数据恢复与防范建议

引言&#xff1a; 在数字化日益深入生活的今天&#xff0c;网络安全问题愈发凸显其重要性。其中&#xff0c;勒索病毒作为一种恶意的网络攻击手段&#xff0c;已经对个人和企业造成了巨大的损失。特别是.mkp勒索病毒&#xff0c;以其狡猾的传播方式和破坏性的加密手段&#xf…

vue3 watch 停止监听以及重新开始监听

vue3的watch终止监听&#xff0c;只需要将watch赋值给一个变量&#xff0c;当达到条件调用watch赋值的那个变量就可以终止监听了。 <template><div>{{ data.val }}<button click"add">加一</button></div> </template> <scr…