日期:2014-05-20  浏览次数:20804 次

关于线程中sleep和优先级的一个问题
请看如下代码:
public   class   ThreadTestSleep   implements   Runnable   {
        public   void   run()   {

                for   (int   k   =   0;   k   <   5;   k++)   {
                        if   (k   ==   2)   {
                                try   {
                                        Thread.currentThread().sleep(5000);
                                }   catch   (Exception   e)   {}
                        }
                        System.out.println(Thread.currentThread().getName()
                                                              +   "   :   "   +   k);
                }
        }

        public   static   void   main(String[]   args)   {
                Runnable   r   =   new   ThreadTestSleep();
                Thread   t1   =   new   Thread(r,   "t1_name ");
                Thread   t2   =   new   Thread(r,   "t2_name ");
                t1.setPriority(Thread.MAX_PRIORITY);
                t2.setPriority(Thread.MIN_PRIORITY);
                t1.start();
                t2.start();
        }
}
---------------------
运行结果:
t1_name   :   0
t2_name   :   0
t1_name   :   1
t2_name   :   1
t2_name   :   2
t1_name   :   2
t2_name   :   3
t1_name   :   3
t2_name   :   4
t1_name   :   4

------------------
问题如下:
我不明白的是t1比t2的优先级要高。sleep之后为什么t2先打印出来的内容,t1后打印出来了内容呢?t2也要进行sleep啊?


------解决方案--------------------
Thread.currentThread().sleep(5000);

// 优先级高的不是先运行吗??运行不就休眠了吗
------解决方案--------------------
上面说的不对吧,优先级高的是先休眠,可是它也是时间到後,也是先醒来。
这时优先级低也应该是在睡眠,所以应该始终是t1先被打出来
------解决方案--------------------
我用楼主的代码运行了5次,每次的结果都是

t1_name : 0
t1_name : 1
t2_name : 0
t2_name : 1
t1_name : 2
t1_name : 3
t1_name : 4
t2_name : 2
t2_name : 3
t2_name : 4

楼主的思路理论上是正确的.但是出现这个问题原因我水平太低解释不清,不管哪本书上都建议过不要用线程的优先级来控制线程之间执行的先后顺序.