调用yield方法会使当前线程从RUNNING状态切换到RUNNABLE状态
当i==1时候,调用yield,添加提示。
private static void testYield() { //调用yield方法会使当前线程从RUNNING状态切换到RUNNABLE状态 for (int i = 0; i < 20; i++) { Thread tread1 = createThread(1); Thread tread2 = createThread(2); tread1.start(); tread2.start(); try { //等待两个线程运行结束 tread1.join(); tread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(); } } private static Thread createThread(final int i) { return new Thread(new Runnable() { @Override public void run() { for (int i1 = 0; i1 < 50; i1++) { if (i == 1){ Thread.yield(); } System.out.print(i); } } }); } 2222222222222222222222222222222222222222222222222211111111111111111111111111111111111111111111111111 1222222222222222222222222222222222222222222222222221111111111111111111111111111111111111111111111111 1111111111112222222222222222222222222222222222222222222222222211111111111111111111111111111111111111 1222222222222222222222222222222222222222222222222221111111111111111111111111111111111111111111111111 1222222222222222222222222222222222222222222222222221111111111111111111111111111111111111111111111111 1222222222222222222222222222222222222222222222222221111111111111111111111111111111111111111111111111 1222222222222222222222222222222222222222222222222221111111111111111111111111111111111111111111111111 1222222222222222222222222222222222222222222222222221111111111111111111111111111111111111111111111111 2222222222222222222222222222222222222222222222222211111111111111111111111111111111111111111111111111 1222222222222222222222222222222222222222222222222221111111111111111111111111111111111111111111111111 1222222222222222222222222222222222222222222222222221111111111111111111111111111111111111111111111111 1222222222222222222222222222222222222222222222222221111111111111111111111111111111111111111111111111 2222222222222222222222222222222222222222222222222211111111111111111111111111111111111111111111111111 2222222222222222222222222222222222222222222222222211111111111111111111111111111111111111111111111111 2222222222222222222222222222222222222222222222222211111111111111111111111111111111111111111111111111 2222222222222222222222222222222222222222222222222211111111111111111111111111111111111111111111111111 1222222222222222222222222222222222222222222222222221111111111111111111111111111111111111111111111111 1222222222222222222222222222222222222222222222222221111111111111111111111111111111111111111111111111 1222222222222222222222222222222222222222222222222221111111111111111111111111111111111111111111111111根据两次的测试结果: 现象
没有调用yield,1和2几乎是随机打印调用了yield,大部分是2先打印完,就算1先打印,但是会释放线程CPU,最后1线程才打印完。sleelp会导致当前线程暂停指定的时间,没有CPU的时间片消耗 yield只是对CPU调度器的一个提示,如果CPU调度器没有忽略这个提示,它会导致线程上下文切换 sleep会使线程短暂block,会在给定的时间内释放CPU资源 yield会使RUNNING状态的Thread进入RUNNABLE状态(如果CPU没有忽略这个提示的话) sleep几乎百分百完成了给定时间的休眠,而yield的提示不一定能担保 一个线程sleep另一个线程调用interrupt会捕获到中断信号,而yield不会。