线程相关方法之yield方法
yield方法是Thread类的一个静态方法,这个方法是困惑了我很久的一个方法, 为什么这么说呢?首先我是比较喜欢逛一些IT社区的,在上面也看了一些关于多线程相关的东西,自然这个方法的相关说明和演示也看过不少,但问题就在这,当我自己准备写关于这个方法的学习笔记时,我开始困惑了。

因为网上不少博客对yield()方法的说明都是“调用此方法的线程会放弃当前CPU的使用权,返回可运行(就绪状态),然后调度程序可能立马选择当前线程,又开始执行。所以调用该方法可能不会有效果”

因为网上有大量的博客都是这样说的,所以我一度认为就是这样的,知道我看了JDK源码里面的注释:
    /**
     * A hint to the scheduler that the current thread is willing to yield
     * its current use of a processor. The scheduler is free to ignore this
     * hint.
     *
     * <p> Yield is a heuristic attempt to improve relative progression
     * between threads that would otherwise over-utilise a CPU. Its use
     * should be combined with detailed profiling and benchmarking to
     * ensure that it actually has the desired effect.
     *
     * <p> It is rarely appropriate to use this method. It may be useful
     * for debugging or testing purposes, where it may help to reproduce
     * bugs due to race conditions. It may also be useful when designing
     * concurrency control constructs such as the ones in the
     * {@link java.util.concurrent.locks} package.
     */
    public static native void yield();
多余的我们先不看,只看第一条即可:A hint to the scheduler that the current thread is willing to yield its current use of a processor. The scheduler is free to ignore this hint.,翻译过来就是:提示调度器当前线程愿意放弃持有的CPU资源,调度器可以自由忽略这个提示

那么问题来了,放弃和愿意放弃是截然不同的两个概念。这正是我困惑的地方,网上的描述都是放弃自己持有的CPU资源, 回到就绪状态。我该选择那个观点?最终我选择相信源码里面的注释。

用自己的话描述上面注释中那一句简单的观点就是:调用yield()方法只是暗示调度器当前线程愿意放弃持有的CPU资源,调度器完全可以不理会这个暗示,以致啥都不会发生, 也就是说属于调度器的权利还是在调度器那里, 并不是一调用这个方法就立即让出资源,然后等待调度器在此选中,说白了放不放弃CPU资源自己说了不算,得听调度器的。这让我联想到了System.gc()方法,只是对垃圾回收的一个建议。

说了那么多,感觉少点代码,有点空。但是如果上面我理解的是正确的,那么代码示例就没什么卵用(当然,就算我理解的是错误的,写一个demo也不太容易看出让步的现象)。

不过就算这样,我还是贴出个没什么卵用的demo,大家看看就好。结果啥的我就不贴了,毕竟贴结果同样或者说更加无卵用。。。
package org.devsong.test;

/**
*各位看看就好
*/
public class ThreadTest {
	public static void main(String[] args) throws InterruptedException {
		new Thread(new MyRunnable("A")).start();
		new Thread(new MyRunnable("B")).start();
	}
}

class MyRunnable implements Runnable {

	private String str = "";

	public MyRunnable(String str) {
		this.str = str;
	}

	@Override
	public void run() {
		int i = 0;
		while (i++ < 20) {
			System.out.println(str + " " + i);
			if(i == 10) {
				Thread.yield();
			}
		}
	}
}


以上只是我个人的看法,若您有好的想法,欢迎给我留言。
 
It's
欢迎访问本站,欢迎留言、分享、点赞。愿您阅读愉快!
*转载请注明出处,严禁非法转载。
https://www.devsong.org
QQ留言 邮箱留言
头像
引用:
取消回复
提交
涂鸦
涂鸦
热门