你的想法确实是没有错的,线程的优先级是这样:Every thread has a priority. Threads with higher priority are executed in preference to threads with lower priority.
但是为什么会出现 A,C,B 的执行顺序呢?原因应该在于在你的main中的语句顺序,在C启动之前,A线程已经执行完成了。所以出现了 ACB 的顺序。正常的当然应该是 CAB 的顺序了。
ACB和CAB这两种顺序可能会随机地出现。你并不能控制。如果你想验证优先级的话,就必须避免这点,你可以在run()方法的第一句执行:
<<try {Thread.sleep(1000);}catch(InterruptedException ex){}>>
这样就可以能够保证C启动之前A还在运行,这样你就可以得到CAB这样的正确顺序了。:)

解决方案 »

  1.   

    to:huanglishuo2000 (朔)
    我copy你的过去,结果是cab啊 
    ---------------------
    to xiaohaiz(老土进城,两眼通红)原因应该在于在你的main中的语句顺序,在C启动之前,A线程已经执行完成了。所以出现了 ACB 的顺序
    -----------------------------
    这句话我觉得不对,在main中,仅仅是进入队列,并没有启动况且都按你说的abc都按顺序start了才能按顺序的话,还要优先级做什么啊:——)
      

  2.   

    TO qlampskyface(天空的样子):
    <<这句话我觉得不对,在main中,仅仅是进入队列,并没有启动>>
    呵呵,谁说没有启动,再好好看看:
    <<
    First.start();
    Second.start();
    Third.start();
    >>
      

  3.   

    不过这也是俺比较疑惑的地方,在vmspec中,关于线程调度的规范实际上定义得非常松散,当然这样做是有原因的,这是为了方便jvm在不同的硬件平台和操作系统上实现。但是也正是这样做造成了Java一个天生的缺陷:“无法控制线程的调度”(BTW,另一个缺陷是无法控制垃圾收集)。所以,俺也怀疑这样的结果是依赖于具体的vm实现的。因为在jdk最近的版本中,线程是真正的线程,是通过本地方法来调度的。如果没有记错的话,在最早的jdk版本中线程实现还是一个虚假的线程实现(不再继续展开)。可惜俺现在手头只有SUN的HotSpot虚拟机。在这个虚拟机下的表现行为确实如上所述,但是可能在其他的虚拟机上表现的行为可能又是不一样。可惜无法验证。如果谁有allire vm,ibm vm,gcj vm,可以做一下试验来进行验证。可以想象一下,如果某人遵循vmspec自己实现了一个vm,在Thread调度的地方忽略所有优先级的设置,通过线程顺序执行来模拟实现。那么如果楼主这个程序跑在这个假设的vm之上,行为肯定就会有问题了。但是能说这个vm有问题吗?不能,因为它遵循了vmspec。所以这个问题很可能依赖于不同的虚拟机实现。以上只是一些没有把握的设想,大家不要太认真,呵呵。
    :)
      

  4.   

    First.setPriority( Thread.NORM_PRIORITY+0);这句传错了,应该是First.setPriority( Thread.NORM_PRIORITY+1);,这样才出现我所说的情况。请各位大哥原谅,是小弟的疏忽~~hehe
      

  5.   

    我的操作系统是win2000 professional
      

  6.   

    TO huanglishuo2000(朔):
    呵呵,那到不一定,Thread.NORM_PRIORITY+0 也通常会出现上述的情况的。
    俺做实验的系统也是inetl+win32,估计你使用的vm也是 HotSpot。
      

  7.   

    谢谢各位的指教,现在明白了,是xiaohaiz大哥说得对,我用了thread.sleep()得到了想要的结果:
    b 6
    c 10
    c 10
    b 6
    a 1
    a 1
      

  8.   

    老土哥,多谢你啊,我才学习java不久,希望能得到高手的指教,请问你的QQ号是多少啊?以后再有难题方便请教您啊