程序如下:
public class ThreadTest{ public static void main(String[] a){
ThreadClass t1 = new ThreadClass("T1");
                  ThreadClass t2 = new ThreadClass("T2");
//t1.setPriority(10);
//t2.setPriority(10);
t1.start();    t2.start();
}
}class ThreadClass extends Thread{
String msg ;
public ThreadClass(String str){
msg = str;
}
public void run(){
for(int i=0;i<20;i++){
System.out.println(msg+":"+getPriority()+":"+i);
}
}
}
执行结果如下,即两个线程(优先级都是默认的5)是交错执行的,可以认为操作系统采用的是时间片方式的线程切换。
T1:5:0
T1:5:1
T1:5:2
T1:5:3
T1:5:4
T2:5:0   //此处可见是交互执行的
T2:5:1
T2:5:2
T2:5:3
T1:5:5   //此处可见是交互执行的
T1:5:6
T1:5:7
T1:5:8
...
T2:10:19
T2:10:0
T2:10:1
T2:10:2
...
T1:10:18
T1:10:19
T2:10:18
T2:10:19但是若将程序中的注释去掉,即将两个线程的优先级都设为10,执行结果却是T2一直要等到T1结束的时候才能得到执行,如下:
T1:10:0
T1:10:1
T1:10:2
...
T1:10:19   
T2:10:0  //一直等到T1执行结束,T2才能执行
T2:10:1
T2:10:2
...
T2:10:19按说,上面两次T1和T2的优先级都一样的,为什么执行结果却不一样,望同志们给予解答啊!

解决方案 »

  1.   

    怀疑lz的猩猩是偷来的吧lz程序好像没有问题吧
      

  2.   

    楼上的,呵呵,不上CSDN已经有快2年了!另,我的循环改成50,100,结果还是如上所述的那样,所以没搞明白Java的线程调度器的原理!望大家能不吝赐教!
      

  3.   

    原来是牛人啊
    两年前就是猩猩了
    佩服佩服
    程序方面应该是你的机器太快了吧
    我调过200是一点问题都没有的
    java的线程调度记得好像与os关系特别大
    在win下面,好像不能完全控制说的不对的地方请大家指出
      

  4.   

    问题在两方面:1.你的线程主体基本上都是cpu计算时间,根本没有空闲时间可以让出来,所以要在for循环里面加yield();出让cpu给等待线程。2.优先级别太高了(当前主线程是5), 比当前的主线程的优先级别都高, 当然是t1.start(); 后主线程就被阻塞了, 知道第一个线程完成才轮到主线程去t2.start();,所以你得到的结果自然先t1后t2,你把优先级别降低到5以下看看。
      

  5.   

    believefym(暮色,miss,迷失,miss) ( 两星(中级)研究生毕业了吗?
      

  6.   

    是不是因为再windows下,优先级高的线程,时间片就长点,优先级低的时间片就短点呢?
      

  7.   

    window的cpu线程调度不是简单按照时间片来的,具体可以看看window的进程调度算法, 不像UNIX是按照时间轮转法来进行的。 高优先级别高CPU占用的的线程如果不主动让出CPU的话那么其它线程根本不会被调用到,直到最高优先的线程执行完成, 这也是JAVA虚拟机垃圾回收的一个痛处的来源,垃圾回收基本上就是CPU对内存空间的计算操作,所以会高度抢占CPU,所以垃圾回收的时候应用会明显很慢, 我们在使用jbuilder,WSAD5, Intellij Idea等存java开发的开发工具时候可以感觉到这点。