先上一段代码

  1. public class YieldExcemple {
  2.  
  3. public static void main(String[] args) {
  4. Thread threada = new ThreadA();
  5. Thread threadb = new ThreadB();
  6. // 设置优先级:MIN_PRIORITY最低优先级1;NORM_PRIORITY普通优先级5;MAX_PRIORITY最高优先级10
  7. threada.setPriority(Thread.MIN_PRIORITY);
  8. threadb.setPriority(Thread.MAX_PRIORITY);
  9.  
  10. threada.start();
  11. threadb.start();
  12. }
  13. }
  14.  
  15. class ThreadA extends Thread {
  16. public void run() {
  17. for (int i = 0; i < 10; i++) {
  18. System.out.println("ThreadA--" + i);
  19. Thread.yield();
  20. }
  21. }
  22. }
  23.  
  24. class ThreadB extends Thread {
  25. public void run() {
  26. for (int i = 0; i < 10; i++) {
  27. System.out.println("ThreadB--" + i);
  28. Thread.yield();
  29. }
  30. }
  31. }

本以为运行结果如下:

  1. ThreadB--0
  2. ThreadA--0
  3. ThreadB--1
  4. ThreadA--1
  5. ThreadB--2
  6. ThreadA--2
  7. ThreadB--3
  8. ThreadA--3
  9. ThreadB--4
  10. ThreadA--4
  11. ThreadB--5
  12. ThreadA--5
  13. ThreadB--6
  14. ThreadA--6
  15. ThreadB--7
  16. ThreadA--7
  17. ThreadB--8
  18. ThreadA--8
  19. ThreadB--9
  20. ThreadA--9

结果却出现了多种情况,如下:

  1. ThreadB--0
  2. ThreadB--1
  3. ThreadB--2
  4. ThreadB--3
  5. ThreadB--4
  6. ThreadB--5
  7. ThreadB--6
  8. ThreadB--7
  9. ThreadB--8
  10. ThreadB--9
  11. ThreadA--0
  12. ThreadA--1
  13. ThreadA--2
  14. ThreadA--3
  15. ThreadA--4
  16. ThreadA--5
  17. ThreadA--6
  18. ThreadA--7
  19. ThreadA--8
  20. ThreadA--9

或者

  1. ThreadB--0
  2. ThreadA--0
  3. ThreadB--1
  4. ThreadA--1
  5. ThreadA--2
  6. ThreadA--3
  7. ThreadA--4
  8. ThreadA--5
  9. ThreadA--6
  10. ThreadA--7
  11. ThreadA--8
  12. ThreadA--9
  13. ThreadB--2
  14. ThreadB--3
  15. ThreadB--4
  16. ThreadB--5
  17. ThreadB--6
  18. ThreadB--7
  19. ThreadB--8
  20. ThreadB--9

后翻阅资料得知:

Java线程中的Thread.yield( )方法,译为线程让步。顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,

让自己或者其它的线程运行,注意是让自己或者其他线程运行,并不是单纯的让给其他线程。

yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保

证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!

举个例子:一帮朋友在排队上公交车,轮到Yield的时候,他突然说:我不想先上去了,咱们大家来竞赛上公交车。然后所有人就一块冲向公交车,

有可能是其他人先上车了,也有可能是Yield先上车了。

但是线程是有优先级的,优先级越高的人,就一定能第一个上车吗?这是不一定的,优先级高的人仅仅只是第一个上车的概率大了一点而已,

最终第一个上车的,也有可能是优先级最低的人。并且所谓的优先级执行,是在大量执行次数中才能体现出来的。

转自:https://www.cnblogs.com/java-spring/p/8309931.html

(转)Thread中yield方法的更多相关文章

  1. Thread中yield方法

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

  2. (二)线程Thread中的方法详解

    1.start() start()方法的作用讲得直白点就是通知"线程规划器",此线程可以运行了,正在等待CPU调用线程对象得run()方法,产生一个异步执行的效果.通过start( ...

  3. 线程Thread中的方法详解(二)

    1.start() start()方法的作用讲得直白点就是通知"线程规划器",此线程可以运行了,正在等待CPU调用线程对象得run()方法,产生一个异步执行的效果.通过start( ...

  4. Thread类中yield方法

    Yield方法可以暂停当前正在执行的线程对象,让其他有相同优先级的线程执行.它是一个静态方法而且只保证当前线程放弃CPU占用而不能保证其它线程一定能占用CPU,执行yield()的线程有可能在进入到暂 ...

  5. java:多线程(代理模式,Thread中的方法,Timer,生产者和消费者)

    *进程:一个正在运行的程序,进程是操作系统分配资源的基本单位,每个进行有独立的内存空间,进程之间切换开销较大. *线程:一个轻量级的进程,线程是任务调度的基本单位,一个进程可以有多个线程, * 系统没 ...

  6. java多线程2:Thread中的方法

    静态方法: Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程". 为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程进行操作.下面 ...

  7. Thread中join()方法进行介绍

    http://www.cnblogs.com/skywang12345/p/3479275.html https://blog.csdn.net/dabing69221/article/details ...

  8. Java多线程2:Thread中的实例方法

    Thread类中的方法调用方式: 学习Thread类中的方法是学习多线程的第一步.在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别: 1 ...

  9. 2.Thread中的实例方法

    (转自:http://www.cnblogs.com/xrq730/p/4851233.html) Thread类中的方法调用方式: 1.this.XXX 这种调用方式表示的线程是:线程实例本身 2. ...

随机推荐

  1. 跨服务器做yum源

    服务器无法上网,然后自己根据光盘搭建的YUM源不够用.RPM安装软件,各种依赖,找包烦死. 先做个 能上外网的 http proxy 找一个可以上Internet的服务器,然后起一个squid服务, ...

  2. Socket 服务端使用多线程实现多客户端通讯实例

    socket通信原理 Java多线程实现Socket通讯 1.服务端 import java.io.IOException; import java.net.ServerSocket; import ...

  3. Mac下利用safari调试 Cordova的WebApp

    1.打开Safari,打开顶部菜单栏中的'偏好设置',切换'高级',将“在菜单栏中显示开发菜单”钩上: 2.打开iPhone的“设置”程序,进入“Safari”->“高级”页面开启“Web检查器 ...

  4. I - Cows

    来源 poj 3348 Your friend to the south is interested in building fences and turning plowshares into sw ...

  5. windows 开启热点的命令行工具

    hotspot.bat @echo off @echo. setlocal enabledelayedexpansion if "%1" == "set" ( ...

  6. hdparm命令(转)

    转自:http://man.linuxde.net/hdparm hdparm命令提供了一个命令行的接口用于读取和设置IDE或SCSI硬盘参数. 语法 hdparm(选项)(参数) 选项 -a< ...

  7. Django中,ajax检测注册用户信息是否可用?

    ajax检测注册用户信息主体思路 1.在settings.py中配置需要使用的信息 #对static文件进行配置 STATICFILES_DIRS=[ os.path.join(BASE_DIR,'s ...

  8. [No0000109]Git2/9-安装Git

    最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑.不过,慢慢地有人把它移植到了Windows上.现在,Git可以在Linux.Unix.Mac和Window ...

  9. Exception 06 : org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session :

    异常名称: org.hibernate.NonUniqueObjectException: A different object with the same identifier value was ...

  10. 2016年蓝桥杯省赛A组c++第1题

    /* 某君新认识一网友. 当问及年龄时,他的网友说: “我的年龄是个2位数,我比儿子大27岁, 如果把我的年龄的两位数字交换位置,刚好就是我儿子的年龄” 请你计算:网友的年龄一共有多少种可能情况? 提 ...