【Java--线程】线程的生命周期及线程的几种状态

生命周期:

线程是具有生命周期的,就好比你早上打开微信,晚上关掉微信一样,中途微信还要执行调用CPU资源,准备启动,以及后台等待消息一系列线程操作。

状态:

线程主要包括 7 种状态,分别是出生状态、就绪状态、运行状态、等待状态、休眠状态、阻塞状态和死亡状态

状态说明

  1. 出生状态:用户在创建线程时所处的状态,在用户使用该线程实例调用 start() 方法之前,线程都处于出生状态。
  2. 就绪状态:也称可执行状态,当用户调用 start() 方法之后,线程处于就绪状态。
  3. 运行状态:当线程得到系统资源后进入运行状态。
  4. 等待状态:当处于运行状态下的线程调用 Thread 类的 wait() 方法时,该线程就会进入等待状态。进入等待状态的线程必须调用 Thread 类的 notify() 方法才能被唤醒。notifyAll() 方法是将所有处于等待状态下的线程唤醒。
  5. 休眠状态:当线程调用 Thread 类中的 sleep() 方法时,则会进入休眠状态。
  6. 阻塞状态:如果一个线程在运行状态下发出输入/输出请求,该线程将进入阻塞状态,在其等待输入/输出结束时,线程进入就绪状态。对阻塞的线程来说,即使系统资源关闭,线程依然不能回到运行状态。
  7. 死亡状态:当线程的 run() 方法执行完毕,线程进入死亡状态。

提示:一旦线程进入可执行状态,它会在就绪状态与运行状态下辗转,同时也可能进入等待状态、休眠状态、阻塞状态或死亡状态。

就绪状态:

  • 调用 sleep() 方法。
  • 调用 wait() 方法。
  • 等待输入和输出完成。


当线程处于就绪状态后,可以用如下几种方法使线程再次进入运行状态:

  • 线程调用 notify() 方法。
  • 线程调用 notifyAll() 方法。
  • 线程调用 intermpt() 方法。
  • 线程的休眠时间结束。
  • 输入或者输出结束。

示例分析:

定义包子笼:


public class 包子笼 {
    public int pack = 100;

    /**
     * 同步方法监视的对象是this
     * @param name
     */
    public synchronized boolean eat(String name){
        if (this.pack <= 0) return true;
        System.out.println(name + "吃第" + this.pack + "个包子");
        this.pack--;
        return false;
    }
}

做包子的

他做完100个包子就去休息,而等吃包子吃完了就唤醒做包子的

public class 做包子 extends Thread{
    private 包子笼 p = null;
    private String name = null;

    public 做包子(包子笼 p, String name) {
        this.p = p;
        this.name = name;
    }

    public void run() {
        try {
            while (true) {
                synchronized (p) {
                    if (p.pack <= 0) {
                        p.pack = 100;
                        System.out.println (this.name + "做好了" + p.pack + "个包子");

                    } else {
                        p.notifyAll ();
                        p.wait ();
                    }
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace ();
        }
    }
}

吃包子的

他们吃完100个包子就去休息,并唤醒做包子,做好后继续吃,并让做包子的休息

public class 吃包子 extends Thread {
    private 包子笼 p = null;
    private String name = null;

    public 吃包子(包子笼 p, String name) {
        this.p = p;
        this.name = name;
    }

    public void run() {
        try {
            while (true) {
                synchronized (p) {
                    if (this.p.pack <= 0) {
                        p.notify ();//叫醒做包子的
                        p.wait ();//睡着  //监视对象进程的锁,把对象里的进程数。。。释放锁。

                    } else {
                        System.out.println (this.name + "吃第" + this.p.pack + "个包子");
                        this.p.pack--;
                    }
                }
                Thread.sleep (1);
            }
        } catch (InterruptedException e) {
            e.printStackTrace ();
        }

    }
}

Test包子类:

public class Test包子 {
    public static void main(String[] args) {
        包子笼 p = new 包子笼 ();
        做包子 m = new 做包子 (p, "山治");
        吃包子 c1 = new 吃包子 (p, "索隆");
        吃包子 c2 = new 吃包子 (p, "路飞");
        c1.start ();
        c2.start ();
        m.start();
    }
}

输出测试:

索隆吃第100个包子
路飞吃第99个包子
索隆吃第98个包子
路飞吃第97个包子
索隆吃第96个包子
路飞吃第95个包子
索隆吃第94个包子
路飞吃第93个包子
索隆吃第92个包子
路飞吃第91个包子
路飞吃第90个包子
索隆吃第89个包子
路飞吃第88个包子
索隆吃第87个包子
路飞吃第86个包子
索隆吃第85个包子
路飞吃第84个包子
索隆吃第83个包子
索隆吃第82个包子
路飞吃第81个包子
路飞吃第80个包子
索隆吃第79个包子
索隆吃第78个包子
路飞吃第77个包子
索隆吃第76个包子
路飞吃第75个包子
索隆吃第74个包子
路飞吃第73个包子
路飞吃第72个包子
索隆吃第71个包子
路飞吃第70个包子
索隆吃第69个包子
路飞吃第68个包子
索隆吃第67个包子
索隆吃第66个包子
路飞吃第65个包子
索隆吃第64个包子
路飞吃第63个包子
索隆吃第62个包子
路飞吃第61个包子
索隆吃第60个包子
路飞吃第59个包子
路飞吃第58个包子
索隆吃第57个包子
索隆吃第56个包子
路飞吃第55个包子
索隆吃第54个包子
路飞吃第53个包子
路飞吃第52个包子
索隆吃第51个包子
索隆吃第50个包子
路飞吃第49个包子
索隆吃第48个包子
路飞吃第47个包子
路飞吃第46个包子
索隆吃第45个包子
路飞吃第44个包子
索隆吃第43个包子
路飞吃第42个包子
索隆吃第41个包子
索隆吃第40个包子
路飞吃第39个包子
索隆吃第38个包子
路飞吃第37个包子
路飞吃第36个包子
索隆吃第35个包子
索隆吃第34个包子
路飞吃第33个包子
路飞吃第32个包子
索隆吃第31个包子
路飞吃第30个包子
索隆吃第29个包子
路飞吃第28个包子
索隆吃第27个包子
索隆吃第26个包子
路飞吃第25个包子
索隆吃第24个包子
路飞吃第23个包子
索隆吃第22个包子
路飞吃第21个包子
索隆吃第20个包子
路飞吃第19个包子
路飞吃第18个包子
索隆吃第17个包子
索隆吃第16个包子
路飞吃第15个包子
路飞吃第14个包子
索隆吃第13个包子
路飞吃第12个包子
索隆吃第11个包子
路飞吃第10个包子
索隆吃第9个包子
路飞吃第8个包子
索隆吃第7个包子
索隆吃第6个包子
路飞吃第5个包子
路飞吃第4个包子
索隆吃第3个包子
索隆吃第2个包子
路飞吃第1个包子

 

 

 

文字知识点参考:Java线程的生命周期及线程的几种状态

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值