JAVA多线程08-基础篇-线程让步yield()

本节摘要: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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容