【Java】【多线程】线程的方法yield

tech2022-09-10  113

【Java】【多线程】线程的方法yield

测试测试正常情况测试yield yield和sleep 学而不思则罔,思而不学则殆


调用yield方法会使当前线程从RUNNING状态切换到RUNNABLE状态

测试

测试正常情况

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); } } }); } 1111112222222221222222222222222222222222222221111111111111111111111111111111111111111111222222222222 1222222222222222222222222222222222222222222222222221111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111222222222222222222222222222222222222222222222222221 1222222222222222222222222222222222222222222222222221111111111111111111111111111111111111111111111111 1111111111111111111122222222222222222222222222222122222222222222222222211111111111111111111111111111 1111111222222222222222222222222222222222222222222222222221111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222 1111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222111111 2222222222222222222222222222222222222222222222222211111111111111111111111111111111111111111111111111 1111111111111111111111111111111111112222222222221111111111111122222222222222222222222222222222222222 1111111111111111111112221111112222222222221111111111111111111111122222222222222222222222222222222222 1111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222 2111111111111111111111111111111111111111111111111112222222222222222222222222222222222222222222222222 1222222222222222222222222222222222222222222222222221111111111111111111111111111111111111111111111111 1222222222222222222222222222222222222222222222222221111111111111111111111111111111111111111111111111 1111111111111122211111111122222221111111111111111111111222222221111122222222222222222222222222222222 1111111111111111111111111111111112221111111111222111122222222111222222222222222222222222222222222222 1111122222222222222222222222222222222222222222222222222111111111111111111111111111111111111111111111 1222221111111112221112222111111122211111111111111111111111122111112212222222222222222222222222222222 1111111111111111111122222222222221111222111122222222222222222222222222222211122211121111111111111111

测试yield

当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线程才打印完。

yield和sleep

sleelp会导致当前线程暂停指定的时间,没有CPU的时间片消耗 yield只是对CPU调度器的一个提示,如果CPU调度器没有忽略这个提示,它会导致线程上下文切换 sleep会使线程短暂block,会在给定的时间内释放CPU资源 yield会使RUNNING状态的Thread进入RUNNABLE状态(如果CPU没有忽略这个提示的话) sleep几乎百分百完成了给定时间的休眠,而yield的提示不一定能担保 一个线程sleep另一个线程调用interrupt会捕获到中断信号,而yield不会。

最新回复(0)