java中yield()方法_Java 中 Thread.yield() 方法详解

对于不少初学 Java 线程的小伙伴们,很容易将 Thread 类里的 yield() 方法理解错误,或者理解得不够透彻,先看下源码:多线程

public static native void yield();

是的,你没看错,Thread 类源码中定义的这个方法没有方法体,native 关键字修饰的方法表示原生态方法,方法对应的实现不在这个类文件里,而是在用其余语言(如 C 和 C++)实现的文件中。Java 语言自己不能对操做系统底层进行访问和操做(但能够经过 JNI 接口调用其余语言来实现对底层的访问)。因此,想要知道并理解 yield() 方法的具体实现过程,于初学者来讲并无必要。虽然“无代码无真相”,但采用大白话的解释或许更加通俗易懂吧。函数

Java线程调度的一点背景

在各类各样的线程中,Java 虚拟机必须实现一个有优先权的、基于优先级的调度程序。这意味着 Java 程序中的每个线程被分配到必定的优先权,使用定义好的范围内的一个正整数表示。优先级能够被开发者改变。即便线程已经运行了必定时间,Java 虚拟机也不会改变其优先级。学习

优先级的值很重要,由于 Java 虚拟机和下层的操做系统之间的约定是操做系统必须选择有最高优先权的 Java 线程运行。因此咱们说 Java 实现了一个基于优先权的调度程序。该调度程序使用一种有优先权的方式实现,这意味着当一个有更高优先权的线程到来时,不管低优先级的线程是否在运行,都会中断(抢占)它。这个约定对于操做系统来讲并不老是这样,这意味着操做系统有时可能会选择运行一个更低优先级的线程。spa

理解线程的优先权

接下来,理解线程优先级是多线程学习很重要的一步,尤为是了解 yield() 函数的工做过程:操作系统

一、记住当线程的优先级没有指定时,全部线程都携带普通优先级。

二、优先级能够用从 1 到 10 的范围指定。10 表示最高优先级,1 表示最低优先级,5 是普通优先级。

三、记住优先级最高的线程在执行时被给予优先。可是不能保证线程在启动时就进入运行状态。

四、与在线程池中等待运行机会的线程相比,当前正在运行的线程可能老是拥有更高的优先级。

五、由调度程序决定哪个线程被执行。

六、t.setPriority() 用来设定线程的优先级。

七、记住在线程 start() 方法被调用以前,线程的优先级应该被设定。

八、你可使用常量,如 MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY 来设定优先级。线程

如今,咱们对线程调度和线程优先级有必定理解了,进入主题。翻译

Thread.yield() 方法会使当前线程从执行状态(运行状态)变为可执行状态(就绪状态)。CPU 会从众多的可执行态里选择,也就是说,当前也就是刚刚调用 yield() 方法的那个线程仍是有可能会被再次继续执行的。yield() 方法并非让当前线程暂停,让出时间片去执行其余线程,而在下一次时间片内就必定不会执行了(当前线程只是转换为就绪状态,在下一个本该是本身的却让给其余线程的时间片内也可能再次继续被执行)。code

不少人将 yield 翻译成线程让步。顾名思义,就是说当一个线程使用了这个方法以后,它就会把本身CPU执行的一段时间片让给本身或者其它的线程运行。接口

看以下例子:开发

public class TestYield {

public static void main(String[] args) {

MyThread3 t1 = new MyThread3("t1");

MyThread3 t2 = new MyThread3("t2");

t1.start();

t2.start();

}

}

class MyThread3 extends Thread {

MyThread3(String s) {

super(s);

}

public void run() {

for (int i = 1; i <= 100; i++) {

System.out.println(getName() + ": " + i);

if (i % 10 == 0) {

yield();

}

}

}

}

再看运行结果:

.

.

.

t1: 8

t1: 9

t1: 10

t2: 6

t1: 11

.

.

.

t1: 18

t1: 19

t1: 20

t1: 21

t1: 22

.

.

.

t1: 10 后 t2: 6;t1: 20 后 t1: 21。

总结后可得如下重要的几点:

一、yield 是一个静态的原生(native)方法。

二、yield 告诉当前正在执行的线程把运行机会交给线程池中拥有相同优先级的线程。

三、yield 不能保证使得当前正在运行的线程迅速转换到可运行的状态。

四、它仅能使一个线程从运行状态转到可运行状态,而不是等待或阻塞状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值