线程的生命周期与优先级

来源:互联网 发布:asp.net 投票系统源码 编辑:程序博客网 时间:2024/05/29 18:49

一、线程的生命周期

       一个线程一旦被创建,就标志着它的生命周期开始了。在线程从诞生到生命的消亡这个过程中有四个主要的状态,他们分别是创建,可执行,非可执行,和消亡。

1、 创建

    在java中,通过实例化Thread类对象就可以创建对象了。对象被创建之后一般就进入了可执行状态。

2、可执行状态

    当在线程对象中调用了 start()方法之后,线程就进入了可执行状态。这个线程就会被放到可执行队列中去。

3、非可执行状态

   可以通过调用Thread类的某些方法,比如,wait()、sleep()等将线程变为到非可执行状态。

4、消亡

   当run()方法返回了,线程就会被消亡。


二、线程的优先级

   在一些操作系统中,系统为每个线程分配一个时间片。当某线程的时间片被用完了,那么将CPU的执行权分配给其它线程。此外,决定哪个线程优先执行的方法还有优先级的方法。在Java中,线程是有其优先级的,优先级的默认取值范围是1~10,默认值是5,可以使用Thread类中setPriority()方法来设定线程优先级。在线程的可执行队列中,优先级高的线程先执行。待优先级高的线程执行完毕,优先级低的才会拥有执行权。如果两个线程优先权一样,那么它们轮流执行。

1、 线程的执行顺序

       在Java中,虚拟机的调度器会从可执行队列中选择优先级较高的线程优先执行。当具有较高优先级的线程终止了,或者变成了“非可执行状态”(调用wait()、sleep()等方法的时候),或者调用了yield()方法,即优先权礼让的时候,次优先级的线程才能够执行。其实,在线程的run()方法中,如果run()中等待时间很长,比如有一个for()循环花费了比较多的时间,那么就会出现不一样的情况,比如下面的例子:

定义run()方法:

       public void run(){
int i=0;
while(isActive()){

if((i%100)==0){
System.out.println(this);
}
  
i++;
if(i==300)
setActive(false);
}
}
}

public static void main(String[] args){
// TODO Auto-generated method stub
//for(int i=0;i<5;i++){
     //if(i==3)
new Threadsuspend(Thread.NORM_PRIORITY,"低优先级线程-"+1);

      new Threadsuspend(Thread.MAX_PRIORITY,"最高优先级线程-"+2);
                //}


 new Threadsuspend(8,"高优先级线程-"+3);
}

运行结果是:

Thread[最高优先级线程-2,10,main]:最高优先级线程-2
Thread[最高优先级线程-2,10,main]:最高优先级线程-2
Thread[最高优先级线程-2,10,main]:最高优先级线程-2
Thread[高优先级线程-3,8,main]:高优先级线程-3
Thread[高优先级线程-3,8,main]:高优先级线程-3
Thread[高优先级线程-3,8,main]:高优先级线程-3
Thread[低优先级线程-1,5,main]:低优先级线程-1
Thread[低优先级线程-1,5,main]:低优先级线程-1
Thread[低优先级线程-1,5,main]:低优先级线程-1


但是,如果作如下更改:

public void run(){
int i=0;
while(isActive()){

if((i%1000)==0){
System.out.println(this);
}
  
i++;
if(i==3000)
setActive(false);
}
}
}

 

运行结果如下所示:

Thread[低优先级线程-1,5,main]:低优先级线程-1
Thread[高优先级线程-3,8,main]:高优先级线程-3
Thread[最高优先级线程-2,10,main]:最高优先级线程-2
Thread[低优先级线程-1,5,main]:低优先级线程-1
Thread[最高优先级线程-2,10,main]:最高优先级线程-2
Thread[最高优先级线程-2,10,main]:最高优先级线程-2
Thread[高优先级线程-3,8,main]:高优先级线程-3
Thread[高优先级线程-3,8,main]:高优先级线程-3
Thread[低优先级线程-1,5,main]:低优先级线程-1

 结果问题:它并不像我们预想的那样,先执行最高优先级别的线程。而显得有些凌乱找不到规律了,为什么呢?这个期望高手解释。

如果再将run()中方法改得更大些比如:

if((i%10000)==0)

{......}

那么结果会变成:

Thread[低优先级线程-1,5,main]:低优先级线程-1
Thread[高优先级线程-3,8,main]:高优先级线程-3
Thread[最高优先级线程-2,10,main]:最高优先级线程-2
Thread[低优先级线程-1,5,main]:低优先级线程-1
Thread[高优先级线程-3,8,main]:高优先级线程-3
Thread[最高优先级线程-2,10,main]:最高优先级线程-2
Thread[高优先级线程-3,8,main]:高优先级线程-3
Thread[最高优先级线程-2,10,main]:最高优先级线程-2
Thread[低优先级线程-1,5,main]:低优先级线程-1

结果问题:更不像我们预想的那样,先执行最高优先级别的线程。而显得有些凌乱找不到规律了,为什么呢?这个期望高手解释。




0 0
原创粉丝点击