Java(线程的生命周期及调度)

来源:互联网 发布:企业网站域名怎么收费 编辑:程序博客网 时间:2024/05/29 08:49

一.线程生命周期
线程是动态的,具有一定的生命周期,会经历从创建,执行,阻塞,直到消亡的过程。在每个线程类中都定义了用于完成实际功能的run方法,这个run方法称为线程体。按照线程体在计算机系统内存中的状态不同,可以将线程分为创建,就绪,阻塞,死亡四个状态。

1.创建状态
当利用new关键字创建线程对象实例后,它仅仅作为一个对象实例存在,JVM没有为其分配CPU时间片等线程运行资源。
2.就绪状态
在处于创建状态的线程中调用start方法将线程的状态转换为就绪状态(也称为可运行状态)。这时,线程已经得到除了CPU时间之外的其它系统资源,只等JVM的线程调度器按照线程的优先级对该线程进行调度,从而使该线程拥有能够获得CPU时间片的机会,一旦该线程获得CPU,就进入运行状态。运行的线程可以调用yield()自动放弃CPU,从而回到就绪状态,以便其它线程能够运行。
3.阻塞状态
阻塞指的是暂停一个线程的执行以等待某个条件发生(如某资源就绪),若线程处于阻塞状态,调度机制就不给它分配任何CPU时间,直接跳过它。
4.死亡状态
当线程体运行结束或者调用线程对象的stop方法后线程将终止运行,由JVM收回线程占用的资源。

二.线程的调度和优先级
当一个线程被创建时,其默认的优先级是5.
在Java中比较特殊的线程是称为守护(Daemon)线程的低级别线程。这个线程具有最低的优先级。用于为系统中其它对象和线程提供服务。将一个用户线程设置为守护线程的方式是在线程对象创建之前调用线程对象的setDaemon()方法。典型的守护线程示例是JVM中的系统资源自动回收线程,它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。

public class TestThreadPriority extends Thread{    public TestThreadPriority(String name)    {        super(name);    }    public static void main(String[] args) {        TestThreadPriority t1=new TestThreadPriority("Thread1");        t1.setPriority(MIN_PRIORITY);        t1.start();        TestThreadPriority t2=new TestThreadPriority("Thread2");        t2.setPriority(NORM_PRIORITY);        t2.start();        TestThreadPriority t3=new TestThreadPriority("Thread3");        t3.setPriority(MAX_PRIORITY);        t3.start();    }    public void run()    {        for(int i=0;i<3;i++)            System.out.println(this.getName()+"is running !");    }   }

分析:由线程运行结果可以看出,3个线程严格按照优先级进行调度,其中线程3尽管启动较晚,但其优先级最高,因此只有等它运行完毕后,其2才开始,最后是1.

0 0
原创粉丝点击