黑马程序员技术交流社区

标题: 这个线程的执行顺序问题。 [打印本页]

作者: _code    时间: 2014-9-9 11:33
标题: 这个线程的执行顺序问题。
public class TestPriority {
        public static void main(String args[]){
                Thread t1 = new Thread (new T1());//定义一个新对象t1;
                Thread t2 = new Thread (new T2());//定义一个新对象t2;
                t1.setPriority(Thread.NORM_PRIORITY +5);//设置t1的优先级别加5
                t1.start();//启动线程t1
                t2.start();//启动线程t2
        }
       

}

class T1 implements Runnable{//实现接口Runnable;
        public void run(){
                for(int i = 0 ; i<1000 ; i++){
                        System.out.println("T1:"+i);
                }
        }
}
class T2 implements Runnable {//实现接口Runnable;
        public void run(){
                for(int i = 0; i<1000;i++){
                        System.out.println("T2:"+i);
                }
        }
}


T2:0
T1:0
T1:1
T2:1

T1:2
。。。。以下省略N多执行
为什么第一个数 是先执行T2: 0呢 ,难道不是先执行 T1 :0么?

作者: 沙拉很好吃    时间: 2014-9-9 11:43
的确有点奇怪,能是 t1.setPriority(Thread.NORM_PRIORITY +5);没有执行完,后面的就获取到cpu的执行权吗
作者: 付江涛    时间: 2014-9-9 12:04
为什么T2不能先执行呢?
不要理解错了。
T2优先级高不是代表每次运行程序 T2都会先运行,而是代表 运行次数多了,T2的运行频率高于T1运行频率。
作者: fantacyleo    时间: 2014-9-9 12:11
付江涛 发表于 2014-9-9 12:04
为什么T2不能先执行呢?
不要理解错了。
T2优先级高不是代表每次运行程序 T2都会先运行,而是代表 运行次数 ...

版大正解。优先级代表的是被CPU选中执行的概率,而非优先执行的保证。同样,yield方法也不是说一定会让出执行权,只是建议CPU去执行其他线程,CPU听不听是不一定的。而且,也不是说你在Java程序中设置的优先级越高,被CPU选中的概率就一定越高。因为JVM最终要依靠操作系统的优先级调度机制,而Java的优先级级别和操作系统的优先级级别之间不存在一一对应。
作者: _code    时间: 2014-9-9 16:57
fantacyleo 发表于 2014-9-9 12:11
版大正解。优先级代表的是被CPU选中执行的概率,而非优先执行的保证。同样,yield方法也不是说一定会让出 ...

难道第一个按顺序执行下来 ,  第一次也不是先执行T1 么, 不是前面的语句优先执行一下吗?
作者: _code    时间: 2014-9-9 16:59
_code 发表于 2014-9-9 16:57
难道第一个按顺序执行下来 ,  第一次也不是先执行T1 么, 不是前面的语句优先执行一下吗? ...

这个优先级高 ,执行概率大 我也明白 , 但是  第一个 执行的是T2 : 0  ,有点迷惑。
作者: 孤鸢    时间: 2014-9-9 17:21
既然是概率,肯定会出现先执行T2的情况,运行一次说明不了问题,多运行几次还是T1先执行的情况多。
作者: _code    时间: 2014-9-9 17:26
孤鸢 发表于 2014-9-9 17:21
既然是概率,肯定会出现先执行T2的情况,运行一次说明不了问题,多运行几次还是T1先执行的情况多。 ...

哦, 了解了,多谢仁兄  ,  原来应用了优先级 之后 ,输出顺序就完全 按照概率来了  , 以前没理解到位,刚刚 运行了10 次 ,完全说明了问题,多谢!
作者: 孤鸢    时间: 2014-9-9 17:30
_code 发表于 2014-9-9 17:26
哦, 了解了,多谢仁兄  ,  原来应用了优先级 之后 ,输出顺序就完全 按照概率来了  , 以前没理解到位 ...

哈哈,共同进步
作者: fouraa    时间: 2014-9-9 18:04
继续学习!!
作者: MeryStyle    时间: 2014-9-9 18:34
优先级高  仅指的是线程在分配cpu资源时具有优先权,其它资源(如打印机)对所有线程是一样的,执行一段程序需要使用多种资源,所以CPU资源优先执行并不代表就一定能优先的执行完成。
作者: fantacyleo    时间: 2014-9-9 20:35
_code 发表于 2014-9-9 16:57
难道第一个按顺序执行下来 ,  第一次也不是先执行T1 么, 不是前面的语句优先执行一下吗? ...

启动线程不等于执行线程。启动线程相当于你说“我也要参加抽奖”,但是第一个抽到谁,不一定
作者: _code    时间: 2014-9-9 22:02
fantacyleo 发表于 2014-9-9 20:35
启动线程不等于执行线程。启动线程相当于你说“我也要参加抽奖”,但是第一个抽到谁,不一定 ...

多            谢!
作者: xpsyztd    时间: 2014-9-9 22:22
路过学习~~~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2