并发编程学习之Thread.yield()方法

并发编程学习之Thread.yield()方法_第1张图片

这个方法是一个静态方法,是“让步”的意思,一旦执行,它会使当前线程让出CPU,即由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权。但是要注意的是让出CPU并不代表当前线程不执行了。当前线程让出CPU后,还是会进行CPU资源的争夺,但是能不能再次被分配到,就不一定了。因此yeild()方法的调用好像就是在说:我已经完成一些最终要的工作了,应该可以休息一下了,可以给其他线程一些工作机会了!

如果你觉得一个线程不那么重要,或者优先级比较低,但是又不想它占用过多的CPU资源,就可以在适当的时候使用Thread.yield(),给予其他重要线程更多的机会。

在https://www.cnblogs.com/java-spring/p/8309931.html中的例子举的很好:

一帮朋友在排队上公交车,轮到Yield的时候,他突然说:我不想先上去了,咱们大家来竞赛上公交车。然后所有人就一块冲向公交车,有可能是其他人先上车了,也有可能是Yield先上车了。但是线程是有优先级的,优先级越高的人,就一定能第一个上车吗?这是不一定的,优先级高的人仅仅只是第一个上车的概率大了一点而已,最终第一个上车的,也有可能是优先级最低的人。并且所谓的优先级执行,是在大量执行次数中才能体现出来的。

可能到这里还不是不太理解这个方法到底什么时候使用,举个例子,如果在程序中某个线程在自旋等待的话,可以使用这个方法让当前线程主动让出 CPU 的执行权,这样可以提供cpu利用率(因为反正也是自旋等待啥也不干,还不如让其它线程占用 CPU)。在 Exchanger 的源码中就是这样使用的:

 private final Object slotExchange(Object item, boolean timed, long ns) {
       ...
        // await release
        int h = p.hash;
        long end = timed ? System.nanoTime() + ns : 0L;
        int spins = (NCPU > 1) ? SPINS : 1;
        Object v;
        while ((v = p.match) == null) {
            if (spins > 0) {
                h ^= h << 1; h ^= h >>> 3; h ^= h << 10;
                if (h == 0)
                    h = SPINS | (int)t.getId();
                else if (h < 0 && (--spins & ((SPINS >>> 1) - 1)) == 0)
                    Thread.yield();
            }
        ...
        return v;
    }

参考资料:

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

你可能感兴趣的:(并发编程学习之Thread.yield()方法)