zoukankan      html  css  js  c++  java
  • Thread.yield()到底有什么效果

    public class YieldExcemple {
    
        public static void main(String[] args) {
            Thread threada = new ThreadA();
            Thread threadb = new ThreadB();
            // 设置优先级:MIN_PRIORITY最低优先级1;NORM_PRIORITY普通优先级5;MAX_PRIORITY最高优先级10
            threada.setPriority(Thread.MIN_PRIORITY);
            threadb.setPriority(Thread.MAX_PRIORITY);
    
            threada.start();
            threadb.start();
        }
    }
    
    class ThreadA extends Thread {
        public void run() {
            for (int i = 0; i < 10; i++) {
                System.out.println("ThreadA--" + i);
                Thread.yield();
            }
        }
    }
    
    class ThreadB extends Thread {
        public void run() {
            for (int i = 0; i < 10; i++) {
                System.out.println("ThreadB--" + i);
                Thread.yield();
            }
        }
    }

    本以为运行结果如下:

    复制代码
    ThreadB--0
    ThreadA--0
    ThreadB--1
    ThreadA--1
    ThreadB--2
    ThreadA--2
    ThreadB--3
    ThreadA--3
    ThreadB--4
    ThreadA--4
    ThreadB--5
    ThreadA--5
    ThreadB--6
    ThreadA--6
    ThreadB--7
    ThreadA--7
    ThreadB--8
    ThreadA--8
    ThreadB--9
    ThreadA--9
    复制代码

    结果却出现了多种情况,如下:

    复制代码
    复制代码
    ThreadB--0
    ThreadB--1
    ThreadB--2
    ThreadB--3
    ThreadB--4
    ThreadB--5
    ThreadB--6
    ThreadB--7
    ThreadB--8
    ThreadB--9
    ThreadA--0
    ThreadA--1
    ThreadA--2
    ThreadA--3
    ThreadA--4
    ThreadA--5
    ThreadA--6
    ThreadA--7
    ThreadA--8
    ThreadA--9
    复制代码

    或者

    复制代码
    ThreadB--0
    ThreadA--0
    ThreadB--1
    ThreadA--1
    ThreadA--2
    ThreadA--3
    ThreadA--4
    ThreadA--5
    ThreadA--6
    ThreadA--7
    ThreadA--8
    ThreadA--9
    ThreadB--2
    ThreadB--3
    ThreadB--4
    ThreadB--5
    ThreadB--6
    ThreadB--7
    ThreadB--8
    ThreadB--9
    复制代码
    复制代码

    后翻阅资料得知:

            Java线程中的Thread.yield( )方法,译为线程让步。顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,

    让自己或者其它的线程运行,注意是让自己或者其他线程运行,并不是单纯的让给其他线程。

            yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保

    证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!

          举个例子:一帮朋友在排队上公交车,轮到Yield的时候,他突然说:我不想先上去了,咱们大家来竞赛上公交车。然后所有人就一块冲向公交车,

    有可能是其他人先上车了,也有可能是Yield先上车了。

         但是线程是有优先级的,优先级越高的人,就一定能第一个上车吗?这是不一定的,优先级高的人仅仅只是第一个上车的概率大了一点而已,

    最终第一个上车的,也有可能是优先级最低的人。并且所谓的优先级执行,是在大量执行次数中才能体现出来的。

    转载: https://www.cnblogs.com/java-spring/p/8309931.html

  • 相关阅读:
    js将UTC时间转化为当地时区时间 用JS将指定时间转化成用户当地时区的时间
    elementUI里面,用tabs组件导致浏览器卡死的问题
    根据数组对象中的属性值删除对象
    js货币金额正则表达式
    vue elementui input不能输入的问题
    vue+elementui--$message提示框被dialog遮罩层挡住问题解决
    Oracle日期函数
    plsql查询报错:Dynamic Performamnce Tables not accessible
    Oracle rownum和rowid的区别
    Oracle通过序列实现主键自增长
  • 原文地址:https://www.cnblogs.com/brithToSpring/p/13335751.html
Copyright © 2011-2022 走看看