当前位置: 首页 > news >正文

【多线程】-- 07 线程礼让与线程强制执行

多线程

5 线程状态

5.3 线程礼让

  • Thread.yield()
  • 礼让线程,让当前正在执行的线程暂停,但不阻塞
  • 将线程从运行状态转为就绪状态
  • 让CPU重新调度,礼让不一定成功!由CPU调度决定。
package com.duo.state;//测试礼让线程
public class YieldTest {public static void main(String[] args) {MyYield myYield = new MyYield();new Thread(myYield, "a").start();new Thread(myYield, "b").start();}
}class MyYield implements Runnable {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "线程开始执行");Thread.yield();  //线程礼让System.out.println(Thread.currentThread().getName() + "线程停止执行");}
}

运行结果:

图1

如上所示,原本a线程应当会相继输出"a线程开始执行"和"a线程停止执行",由于线程礼让,在执行完System.out.println(Thread.currentThread().getName() + "线程开始执行");之后,a线程礼让,b线程开启;同理,在b线程执行完相同语句时,b线程礼让,a线程继续执行。

当注释掉Thread.yield();之后,运行结果:

图2

但实际上每次的运行结果是不同的,主要还是“看CPU心情”!例如同样是未加礼让,就出现了如下所示的运行结果:

图3

5.4 线程强制执行

  • Join合并线程,待此线程执行完成之后,再执行其他线程,其他线程阻塞
  • 可以类比插队
package com.duo.state;//测试join方法
public class JoinTest implements Runnable {@Overridepublic void run() {for (int i = 0; i < 1000; i++) {System.out.println("线程VIP来了" + i);}}public static void main(String[] args) throws InterruptedException {JoinTest joinTest = new JoinTest();Thread thread = new Thread(joinTest);thread.start();//主线程for (int i = 0; i < 500; i++) {if (i == 200) {thread.join();}System.out.println("main" + i);}}
}

运行结果(部分截取):

图4

可以发现,主线程中,只有当i在达到200之后才会接着之前“插队”的VIP线程继续执行。


相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 自定义链 SNAT / DNAT 实验举例
  • Linux--系统结构与操作系统
  • osgSim扩展库
  • 在EFCore中,我何时需要在值对象中添加[Owned]特性?
  • git解决冲突
  • [PTP][1588v2] Delay_Resp消息
  • ubuntu0.22.04.1安装mysql8.0及root密码注意
  • C++:OJ练习(每日练习系列)
  • 使用JAVA语言写一个排队叫号的小程序
  • 《QDebug 2023年11月》
  • 鸿蒙开发笔记
  • docker 推送tar包到远程仓库
  • LeetCode(43)快乐数【哈希表】【简单】
  • vue 路由跳转到其他页面指定位置(锚点)
  • golang 函数选项模式
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • Angular 2 DI - IoC DI - 1
  • CentOS 7 修改主机名
  • CSS 专业技巧
  • ECMAScript入门(七)--Module语法
  • es的写入过程
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Java|序列化异常StreamCorruptedException的解决方法
  • javascript从右向左截取指定位数字符的3种方法
  • maya建模与骨骼动画快速实现人工鱼
  • mockjs让前端开发独立于后端
  • Nodejs和JavaWeb协助开发
  • python docx文档转html页面
  • Spring Cloud中负载均衡器概览
  • Vue UI框架库开发介绍
  • Vue学习第二天
  • win10下安装mysql5.7
  • Zsh 开发指南(第十四篇 文件读写)
  • 前端存储 - localStorage
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 物联网链路协议
  • 一个完整Java Web项目背后的密码
  • 一些css基础学习笔记
  • ionic异常记录
  • NLPIR智能语义技术让大数据挖掘更简单
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​油烟净化器电源安全,保障健康餐饮生活
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • # Redis 入门到精通(九)-- 主从复制(1)
  • # 达梦数据库知识点
  • #pragma pack(1)
  • #QT(串口助手-界面)
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (4)logging(日志模块)
  • (4)事件处理——(7)简单事件(Simple events)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (arch)linux 转换文件编码格式