我家猫猫叫火腿儿 2021-09-30 17:49 采纳率: 100%
浏览 48
已结题

关于线程执行顺序的问题


public class MyThread extends Thread{
    public void run(){
        System.out.println("1");
    }
    public static void main(String[] args){
        MyThread mt = new MyThread();
        mt.start();
        //System.out.println("Now "+Thread.currentThread().getName());
        Thread.currentThread().yield();
        System.out.println("2");
    }
}

概括一下代码就是线程输出1,主线程输出2
直接上代码图,在屏蔽掉那段Now 的输出文本后,输出结果是

2
1

进程已结束,退出代码为 0

也就是说,一开始cpu执行主线程的时候,我让主线程执行yield方法回到可运行状态,他再一次获得了执行的机会,请问是主线程优先级非常高吗?

//////////////////////////////////////////////////////////////////
可是在加上那段之前被屏蔽的代码时,输出结果就变成了这样
1
Now main
2

进程已结束,退出代码为 0

也就是说在加上一行System.out.println之后,主线程的优先级就被降低了?我居然可以用field使得主线程让出CPU并且被实例出来的线程占领了?为什么仅仅一个System.out.println就可以改变优先级呢?很不理解,希望能清晰地帮我讲清楚,谢谢!

  • 写回答

1条回答 默认 最新

  • 我家猫猫叫火腿儿 2021-09-30 19:05
    关注

    解决:
    //Thread.currentThread().getName()方法会造成运行时间增加量级远大于一行的工作量,大幅增加运行该线程时间,从而影响线程执行次序
    //yield()在执行的时候当前线程仍然可以运行小量时间
    //对于CSDN上问题的回答,当屏蔽掉代码段的时候因为主线程需要的运行时间非常短,
    // 因此就像大多数运行情况一样,第一个占着CPU,执行yield()函数,
    // 但是因为剩余的代码片段仅剩下一个print,在yield执行时调主线程到准备状态时,主线程已经运行完毕,因此yield语句对于结果没有影响
    //调用耗时长的代码段时,由于主线程子线程在一个个微小的时间片上交替运行,主线程在第一个时间片来不及输出轮到子线程输出1,随后子线程结束后
    //主线程输出Now main,之后执行yield让主线程返回准备状态其实也没啥影响因为此时只有主线程这一个线程,因此是先执行子线程,后面是主线程

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

    报告相同问题?

    问题事件

    • 系统已结题 10月8日
    • 已采纳回答 9月30日
    • 创建了问题 9月30日

    悬赏问题

    • ¥15 这个四人抢答器代码哪儿有问题?仿真程序怎么写?
    • ¥15 burpsuite密码爆破
    • ¥15 关于#ubuntu#的问题,如何解决?(相关搜索:移动硬盘)
    • ¥15 scikit安装之后import不了
    • ¥15 Ros2编译一个使用opencv的c++节点的时候,报了这个错误,请问怎么解决啊
    • ¥15 人脸识别相关算法 YOLO,AI等
    • ¥15 spark问题方便加V17675797079
    • ¥15 Python代码不打印的原因
    • ¥20 微软SEAL库的安装和使用,VS2022环境配置问题
    • ¥15 数学问题也不知道那种类型的问题