本节摘要:yield()功能介绍,yield()用法示例
一、功能介绍
让当前线程(调用yield()方法的线程)休息一会,即让当前线程由运行状态(Running)进入到可运行状态(Runnable),yield()方法在Thread类中定义,是一个本地方法,值得注意的是yield()并不释放对象锁,所以在同步块中使用yield(),其他线程仍然获取不到锁,需要等待当前线程执行完之后才能获取锁执行任务
二、代码示例
微调一下sleep的例子
public class YieldDemo {
public static void main(String[] args) {
MyRunnable2 r = new MyRunnable2();
Thread t1 = new Thread(r, "t1");
Thread t2 = new Thread(r, "t2");
t1.start();
t2.start();
}
}
class MyRunnable2 implements Runnable {
@Override
public void run() {
synchronized (this) {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + "--" + i);
/**
* t1,t2在运行时会获取同一个对象锁,
* 当取模2为0时,会执行线程让步,但是线程没有释放锁,所以另外一个线程只能等待,直到第一个线程执行完毕才进行
*/
if (i % 2 == 0) {
Thread.yield();
}
}
}
}
}
输出结果:
t1--0
t1--1
t1--2
t1--3
t1--4
t2--0
t2--1
t2--2
t2--3
t2--4
三、结果说明
两个线程共享同一个Runnable实例,run方法是加锁方法。线程并没有交替执行任务,当一个线程执行结束后,另外一个线程才开始执行。
四、总结
- yield()方法是静态方法,可直接调用
- yield()方法并没有释放对象锁
- yield()会使线程由运行时状态转化到可运行状态
转载请注明作者及出处,并附上链接http://www.jianshu.com/u/ada8c4ee308b