概述
线程的运行状态
一个线程从创建、运行到结束总是处于下面的六种状态之一,这些状态的值被封装在java.lang.Thread.State枚举中:
- NEW:新建状态。空的线程对象,系统并没有为其分配资源;此时仅可以启动线程,调用任何其他方法都是无意义的,并且会引发IllegalThreadStateException异常
- RUNNABLE:可运行状态。当处于新建状态的进程调用了start方法并**返回后**,线程处于该状态。(处于可运行状态的线程并不一定立即运行run方法,线程还必须与其他线程竞争CPU时间,只有获得CPU时间才可以运行进程)
- BLOCKED:阻塞状态。正在运行的线程没有运行结束,暂时让出CPU时间,此时其他处于可运行状态的线程就可以获得CPU时间。(处于阻塞状态的原因有很多,如缺少某种资源等)
- WAITING:无限期等待状态。当线程调用wait方法时进入该状态,直到另一个线程调用了该对象的notify方法或notifyAll方法
- TIMED_WAITING:等待指定时间状态。当线程调用sleep方法时线程进入该状态,在指定时间过后线程再次进入可运行状态。
- TERMINATED:结束状态。线程正常结束,即run方法返回,线程运行就结束了。
线程的优先级和调度
每个线程都有一个优先级,当多个线程处于可运行状态时,线程调度器根据线程的优先级调度线程运行,设置和返回优先级的方法如下:
public final void setPriority(int newPriority) //设置线程的优先级
public final int getPriority() //返回线程的优先级
/**
* 优先级取值为1~10的整数,数值越大优先级越高。
* 也可以使用Thread类定义的常量来设置线程的优先级,
* MIN_PRIORITY、NORM_PRIORITY、MAX_PRIORITY
* 优先级分别对应于1、5、10
* 创建线程时如果没有指定优先级,则从创建该线程那里继承优先级
* 一般来说,只有当线程停止运行或由于某种原因被阻塞,较低优先级的线程才有机会运行。
*/
代码示例:
`
public class ThreadDemo extends Thread{
ThreadDemo(String name){
super(name);
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 10; i++) {
System.out.println(getName() + ":" + i);
try {
Thread.sleep((int)Math.random()*100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(getName() + "结束.");
}
public static void main(String[] args) {
ThreadDemo t1 = new ThreadDemo("线程A");
ThreadDemo t2 = new ThreadDemo("线程B");
t1.setPriority(MAX_PRIORITY);
t2.setPriority(NORM_PRIORITY);
t1.start();
t2.start();
}
}
`
运行结果:`
线程A:0
线程B:0
线程A:1
...
线程A:9
线程B:1
线程A结束.
线程B:2
...
线程B:9
线程B结束.`
线程A应该先结束,因为它的优先级高,会获得较多的CPU时间执行。
控制线程的结束
1. 如果run方法是一个确定次数的循环,当run方法结束后,线程运行就结束了。
2. 如果run方法是一个不确定循环,
如`public void run () {
while (true) { }
}
可以在程序中通过改变标志变量的值实现结束进程。
new Runnable{
boolean flag = true;
public void run () {
while (flag) {
//关键代码
}
}
public void stopRun () { flag = false; }
}
`
最后
以上就是懵懂母鸡为你收集整理的线程的状态与调度的全部内容,希望文章能够帮你解决线程的状态与调度所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复