A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 苑桥别馆 中级黑马   /  2014-12-7 14:28  /  1592 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Machine extends Thread
  2. {
  3.         int i=0;
  4.         static StringBuffer str=new StringBuffer();
  5.         public void run(){
  6.                 for(;i<10;i++){
  7.                         //str字符串存储当前运行的线程名称
  8.                         str.append("执行线程"+Thread.currentThread().getName()+"\n");
  9.                 }
  10.         }
  11. };
  12. class MachineMain
  13. {
  14.         public static void main(String[] args)
  15.         {
  16.                 Machine m1=new Machine();
  17.                 Machine m2=new Machine();
  18.                 m1.setName("A");//设置线程名字
  19.                 m2.setName("B");
  20.                 //打印各个线程的默认优先级
  21.                 System.out.println(m1.getName()+"线程默认优先级"+m1.getPriority());
  22.                 System.out.println(Thread.currentThread().getName()+"线程默认优先级"+m1.getPriority());
  23.                 System.out.println(m2.getName()+"线程默认优先级"+m2.getPriority());
  24.                 //对m1m2线程设置最大、最小优先级
  25.                 m1.setPriority(Thread.MAX_PRIORITY);
  26.                 m2.setPriority(Thread.MIN_PRIORITY);
  27.                 //打印修改优先级后的各个线程的优先级
  28.                 System.out.println(m1.getName()+"线程优先级"+m1.getPriority());
  29.                 System.out.println(Thread.currentThread().getName()+"线程优先级"+Thread.currentThread().getPriority());
  30.                 System.out.println(m2.getName()+"线程优先级"+m2.getPriority());
  31.                 //启动线程
  32.                 m1.start();
  33.                 m2.start();
  34.                 //当m1m2线程存活时主线程休眠500毫秒
  35.                 while(m1.isAlive()||m2.isAlive())
  36.                         try{Thread.sleep(500);}catch(InterruptedException e){}
  37.                 //打印str字符串
  38.                 System.out.println(Machine.str);
  39.         }
  40. }
复制代码

如上面代码,我已经将M1的优先级设置为最大、M2的优先级设置为最小,按道理来讲应该先执行M1再执行M2,为什么是这个结果?


A.B线程为什么仍然交替执行?

8 个回复

倒序浏览
优先级只是一种参考的因素,优先级越大抢夺到资源的概率越大,但并不是一定就可以抢到资源,依然是交替执行的,只是轮到他执行的概率比较大而已。
回复 使用道具 举报
Rain2692 发表于 2014-12-7 14:59
优先级只是一种参考的因素,优先级越大抢夺到资源的概率越大,但并不是一定就可以抢到资源,依然是交替执行 ...

是不是代码有问题  ?
回复 使用道具 举报
苑桥别馆 发表于 2014-12-7 15:01
是不是代码有问题  ?

代码应该没有问题吧。。。
回复 使用道具 举报
Rain2692 发表于 2014-12-7 15:03
代码应该没有问题吧。。。

我的意思是说验证优先级的方式有问题
回复 使用道具 举报
苑桥别馆 发表于 2014-12-7 15:05
我的意思是说验证优先级的方式有问题

可以将计数变量的值扩大,从10变到1000,可以看看两者的比例
回复 使用道具 举报
怎么样?测试的怎么样,有结果没?
回复 使用道具 举报
Rain2692 发表于 2014-12-7 15:26
怎么样?测试的怎么样,有结果没?

差别不大
回复 使用道具 举报

不可能的,概率事件有一定的规律的。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马