线程的生命周期与优先级
来源:互联网 发布: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
结果问题:更不像我们预想的那样,先执行最高优先级别的线程。而显得有些凌乱找不到规律了,为什么呢?这个期望高手解释。
- 线程的生命周期与优先级
- 进程的生命周期与优先级
- Java 多线程--- 线程的生命周期及优先级
- Java 多线程(三) 线程的生命周期及优先级
- Java 多线程(三) 线程的生命周期及优先级
- Java 多线程(三) 线程的生命周期及优先级
- Java 多线程(三) 线程的生命周期及优先级
- 线程的生命周期与线程的同步
- 线程的生命周期与线程状态
- 13.3线程的生命周期与线程状态
- 线程的生命周期与线程状态(二)
- 线程2:线程的生命周期与控制
- 线程的优先级与join方法
- 线程的优先级设定与礼让
- Android的进程、线程与优先级
- 线程与线程生命周期
- 线程优先级与线程安全
- 进程与线程(三)进线程的优先级操作
- eclipse最佳设置
- WebView加载本地Html文件
- 又是第一次android
- libzmq的安装
- Oracle表明明存在SQL查询数据提示表不存在异常
- 线程的生命周期与优先级
- mysql 中 sql语句 explain(一)
- 国外最新云技术即将开测 将实现平板玩魔兽
- Python 基础教程(二)
- 《Xilinx可编程逻辑器件设计与开发(基础篇)》连载21:Spartan-6的时钟资源
- curl Expect:100-continue
- Android表单开发及事件侦听
- Android内存优化总结【整理】
- POJ2236 Wireless Network 并查集