我家猫猫叫火腿儿 2021-09-30 17:49 采纳率: 0%
浏览 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日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效