摘要:,看到很多文章把理解为暂停,其实是不准确的,翻译过来用让步更为准确一些。如下在中我们可以看到官方的解释,更多的是作为调试或测试时候使用也就是疯狂重分配,提高切换概率,模拟并发
yield,看到很多文章把yield理解为暂停,其实是不准确的,翻译过来用让步更为准确一些。简单描述下其作用:
使调用yield的正在执行的线程让出cpu,让同等优先权的其他线程包括自身重新进行分配调度
概念性的东西或许有些难理解,打个比方,有一个题库,里面有很多数学题目,学生来抽取题库中的题来解答,其中题库相当所有线程,题目相当于单个线程,学生相当于cpu。那么某一次抽取到题目A,开始解答,解到一半,吧唧,调用了个yield,好的,这个时候学生会把未做完的题目A放回题库,然后重新选取一个题目进行解答,那么下一次选取到哪个题目,仍然是学生自己决定,可能选到题目B、C、D...但是,也可能仍然选到题目A,这就是yield的作用。
demo如下
public class MyThreadYield implements Runnable{ @Override public void run() { for (int i = 10; i < 20; i++) { System.out.println(Thread.currentThread().getName() + ":priority-" + Thread.currentThread().getPriority() + "-------" + i); if (i == 15) { Thread.yield(); } } } public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(new MyThreadYield()); thread.setName("first"); Thread thread1 = new Thread(new MyThreadYield()); thread1.setName("second"); thread.start(); thread1.start(); } }
在java doc中我们可以看到官方的解释,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. * *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. * *
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();
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/68324.html
摘要:线程的基本状态线程的基本操作与内存模型线程组守护线程线程优先级线程安全与隐蔽错误线程的基本状态线程的生命周期线程的基本操作新建线程终止线程立即终止线程所有活动方法在结束线程时会直接终止线程并立即释放这个线程所持有的锁可能引起数据不一致强烈建 1.线程的基本状态 2.线程的基本操作 3. volatile与java内存模型 4.线程组 5.守护线程(Daemon) ...
摘要:目标线程由运行状态转换为就绪状态,也就是让出执行权限,让其他线程得以优先执行,但其他线程能否优先执行时未知的。函数的官方解释是意思是使调用该函数的线程让出执行时间给其他已就绪状态的线程。 线程允许在同一个进程中同时存在多个程序控制流,即通过线程可以实现同时处理多个任务的功能。线程会共享进程范围内的资源,例如内存句柄和文件句柄,但每个线程都有各自的程序计数器、栈以及局部变量。 多线程的实...
摘要:安全性小结我们上边介绍了原子性操作内存可见性以及指令重排序三个在多线程执行过程中会影响到安全性的问题。 指令重排序 如果说内存可见性问题已经让你抓狂了,那么下边的这个指令重排序的事儿估计就要骂娘了~这事儿还得从一段代码说起: public class Reordering { private static boolean flag; private static in...
摘要:告诉当前执行的线程为线程池中其他具有相同优先级的线程提供机会。不能保证会立即使当前正在执行的线程处于可运行状态。当达到超时时间时,主线程和是同样可能的执行者候选。下一篇并发编程线程安全性深层原因 Thread 使用Java的同学对Thread应该不陌生了,线程的创建和启动等这里就不讲了,这篇主要讲几个容易被忽视的方法以及线程状态迁移。 wait/notify/notifyAll 首先我...
阅读 2769·2021-11-23 09:51
阅读 3528·2021-10-08 10:17
阅读 1260·2021-10-08 10:05
阅读 1308·2021-09-28 09:36
阅读 1832·2021-09-13 10:30
阅读 2173·2021-08-17 10:12
阅读 1669·2019-08-30 15:54
阅读 2003·2019-08-30 15:53