让出CPU执行权的yield方法

  • Thread类有一个静态的yield方法,当一个线程在调用yield方法时,实际上就是暗示线程调度器请求让出自己的CPU使用,但是线程调度器可以无条件忽略这个暗示。

  • 操作系统是为每个线程分配一个时间片来占有CPU的,正常情况下当一个线程把分配自己的时间片使用完后,线程调度器才会进行下一轮的线程调度,而当一个线程调用了Thread.yield方法的时候,是告诉线程调度器自己占有的时间片还没有使用完的部分,自己不想使用了,这暗示线程调度器现在就可以进行下一轮的线程调度。

  • 当一个线程调用yield方法的时候,当前线程会让出CPU使用权,然后处于就续状态,线程调度器会从线程就绪队列里获取一个线程优先级最高的线程,当然也有可能会调度到刚刚让出CPU的那个线程来获取CPU执行权。

    1. package com.heiye.learn1;
    2. public class YieldTest implements Runnable {
    3. YieldTest() {
    4. //创建线程并启动
    5. Thread t = new Thread(this);
    6. t.start();
    7. }
    8. @Override
    9. public void run() {
    10. for (int i = 0; i < 5; i++) {
    11. //当i=0让出CPU执行权,放弃时间片,进入下一轮调度
    12. if ((i % 5) == 0) {
    13. System.out.println(Thread.currentThread() + " yield cpu...");
    14. //让出CPU执行权
    15. Thread.yield();
    16. }
    17. }
    18. System.out.println(Thread.currentThread() + " is over");
    19. }
    20. public static void main(String[] args) {
    21. new YieldTest();
    22. new YieldTest();
    23. new YieldTest();
    24. }
    25. }
  • sleep与yield区别

    • 当线程调用sleep方法的时候调用线程会被阻塞挂起指定时间,这期间线程调度器不会去调度该线程。而调用yield方法的时候,线程只是让出自己剩余的时间片,并没有被阻塞挂起,而是直接到线程就绪队列中,线程调度器开始进行下一次的线程调度。当然,线程调度器下一次调度时就有可能调度到当前执行的线程。

5-让出CPU执行权的yield方法的更多相关文章

  1. 线程sleep,wait,notify,join,yield方法解析

    线程的五种状态 线程从创建到销毁一般分为五种状态,如下图: 1) 新建 当用new关键字创建一个线程时,就是新建状态. 2) 就绪 调用了 start 方法之后,线程就进入了就绪阶段.此时,线程不会立 ...

  2. 多线程 Thread.yield 方法到底有什么用?

    概念 我们知道 start() 方法是启动线程,让线程变成就绪状态等待 CPU 调度后执行. 那 yield() 方法是干什么用的呢?来看下源码. /** * A hint to the schedu ...

  3. Java 多线程 sleep()方法与yield()方法的区别

    sleep()方法与yield()方法的区别如下: 1 是否考虑线程的优先级不同 sleep()方法给其他线程运行机会时不考虑线程的优先级,也就是说,它会给低优先级的线程运行的机会.而yield()方 ...

  4. sleep()方法和yield()方法有什么区别?

    两者都是Thread类的静态方法,定义如下 public static void sleep(long millis) throws InterruptedException public stati ...

  5. “全栈2019”Java多线程第八章:放弃执行权yield()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  6. 出让执行权:Task.Yield, Dispathcer.Yield

    Yield 这个词很有意思,叫做“屈服”“放弃”“让步”,字面意义上是让出当前任务的执行权,转而让其他任务可以插入执行.Task.Dispatcher.Thread 都有 Yield() 方法,看起来 ...

  7. Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别? 线程的sleep()方法和yield()方法有什么区别?

    Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别? sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间 ...

  8. Thread中yield方法

    先上一段代码 public class YieldExcemple { public static void main(String[] args) { Thread threada = new Th ...

  9. java线程学习之yield方法

    yield方法是暂停当前正在执行的线程对象,并执行其他线程. 这是一个静态方法,一旦执行,它会使当前线程让出CPU.让出的cpu并不代表当前线程不执行了.当前线程让出CPU后,还会CPU资源的争夺,但 ...

随机推荐

  1. nginx《一安装》

    linux上nginx相关 wget https://nginx.org/download/nginx-1.14.1.tar.gz tar -zxvf nginx-1.14.1.tar.gz ./co ...

  2. java和js中for循环的区别

    java中for循环,先执行语句后循环 for (int i=1;i<10;i++){ for(int b=1;b<=i;b++){ System.out.print(b+"*& ...

  3. RHEL7.2系统下的软件管理(yum)、本地yum源和网络yum源的搭建

    在Liunx系统中,rpm和yum都可以安装软件,但rpm存在安装软件的依赖性,yum安装软件需要yum源 1.yum yum install softwarename ##安装 yum repoli ...

  4. 聊聊spring事务失效的12种场景,太坑了

    前言 对于从事java开发工作的同学来说,spring的事务肯定再熟悉不过了. 在某些业务场景下,如果一个请求中,需要同时写入多张表的数据.为了保证操作的原子性(要么同时成功,要么同时失败),避免数据 ...

  5. (三)羽夏看C语言——进制

    写在前面   由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...

  6. Netty ServerBootstrap如何绑定端口

    这篇讲netty服务端ServerBootstrap如何启动 前言 BootStrap在netty的应用程序中负责引导服务器和客户端.netty包含了两种不同类型的引导: 使用服务器的ServerBo ...

  7. 集合框架3-Arrays 类

    Arrays 和 Collections是分别操作数组和集合的两个工具类.今天就来对 Arrays 中的内容作个总结. 一.Arrays 类概述 Arrays 类位于 java.util包中.Arra ...

  8. Django中使用MySQL数据库的连接配置

    1. 安装pymysql pip install pymysql 2. 导入 # 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置 import pymysql ...

  9. Cython 模块扩展 - 编程语言 替代实现 应用领域 汇总一览

    Python 本身只是一种编程语言规范,可以使用其它编程语言实现它或扩展它:譬如:采有 Python C Java .Net 等重实现 Python,而采用 Python C/C++ C# Java ...

  10. C#开源类库SimpleTCP

    目录 简介 使用方法 实现客户端 实现服务端 总结 简介 工作中经常遇到需要实现TCP客户端或服务端的时候,如果每次都自己写会很麻烦且无聊,使用SuperSocket库又太大了.这时候就可以使用Sim ...