1.yield()定义:
yield()方法的作用是放弃当前的cpu的资源,将他让给其他的任务去占用cpu执行时间。 但是放弃的时间不确定,有可能刚刚放弃又马上获得cpu时间片。《java多线程编程核心技术》
2.如何更好理解yield()?
yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!
举个例子:一帮朋友在排队上公交车,轮到Yield的时候,他突然说:我不想先上去了,咱们大家来竞赛上公交车。然后所有人就一块冲向公交车,有可能是其他人先上车了,也有可能是Yield先上车了。(内容来源:https://www.cnblogs.com/java-spring/p/8309931.html)
3.实例
(1).未使用yield
package com.springboot.thread;
public class ThreadYield {
/*
* yield()方法的作用是放弃当前的cpu的资源,将他让给其他的任务去占用cpu执行时间。
* 但是放弃的时间不确定,有可能刚刚放弃又马上获得cpu时间片。
* */
public static void main(String[] args) {
Thread thread = new Thread(){
int count = 0;
@Override
public void run() {
long beginTime =System.currentTimeMillis();
for (int i = 0 ;i<= 50000000; i++) {
//Thread.yield();
count = count +(i+1);
}
long endTime = System.currentTimeMillis();
System.out.println("Time spent by the program is :" +(endTime-beginTime)+"ms");
}
};
thread.start();
}
}
运行结果:
Time spent by the program is :20ms
(2).使用yield()
package com.springboot.thread;
public class ThreadYield {
/*
* yield()方法的作用是放弃当前的cpu的资源,将他让给其他的任务去占用cpu执行时间。
* 但是放弃的时间不确定,有可能刚刚放弃又马上获得cpu时间片。
* */
public static void main(String[] args) {
Thread thread = new Thread(){
int count = 0;
@Override
public void run() {
long beginTime =System.currentTimeMillis();
for (int i = 0 ;i<= 50000000; i++) {
Thread.yield();
count = count +(i+1);
}
long endTime = System.currentTimeMillis();
System.out.println("Time spent by the program is :" +(endTime-beginTime)+"ms");
}
};
thread.start();
}
}
运行结果:
Time spent by the program is :3586ms
从运行结果更好的说明了,使用yield()当前线程会主动放弃cpu资源,从而花费了更多时间。
参考资料:
1.java多线程编程核心技术