Thread.yield()用法及解释
我们知道在jvm中的并发并非真正的并发,而是cpu将执行过程划分为了时间片,在程序执行过程中,cpu会根据自身的规则分别去调度各个线程。只是这个时间片很短所以给我们的感觉像是并发。某一个线程得到执行也就是这个线程获取到了cpu的执行权。
这里再补充一个刚想到的知识点,与yield无关:每个线程内部都有一个程序计数器大体的作用是用于标记当前执行到的代码行数等信息,当某个线程执行过程中cpu执行权被释放的时候,该线程当前执行的相关数据会被存在程序计数器中,等下次该线程重新获得cpu执行权的时候,jvm会从该线程的程序计数器中恢复该线程之前的执行状态
我们来看一下yield的方法定义:
public static native void yield();
这是个静态native方法,意思是让出当前正在执行的线程的cpu执行权并让其进入可运行状态以允许具有相同优先级的其他线程获得运行的机会,仅仅只有这个作用。但是该方法并不能保证cpu的执行权一定被让出了,正如上面说的,cpu调度哪个线程来执行并不是确定的,所以也有可能当前线程刚刚把执行权让出来马上cpu又将执行权分配给它。该方法在实际应用中其实很少,反正我是没用过。可能的应用场景我觉得应该是某个线程业务中并不是那么重要,所以在某个适当的时机把它让出去让其他的线程先走,例如我觉得像一些应用启动时的日志上报等操作,为了避免它占用过多的cpu资源,先把该线程yield一下。
我们来看个yield的简单使用代码:
public void main() {
Thread thread1 = new Thread(() -> {
for (int