线程的状态与调度

来源:互联网 发布:js只选择小时分钟控件 编辑:程序博客网 时间:2024/06/05 04:45

线程的运行状态

一个线程从创建、运行到结束总是处于下面的六种状态之一,这些状态的值被封装在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);}@Overridepublic 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; }        }
`
0 0