多线程--04--线程的生命周期

线程的生命周期

在这里插入图片描述

public enum Stat{ } 内部内枚举类

线程生命周期,总共有五种状态:

  1. 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();

  2. 就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;

  3. 运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;

  4. 阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才有机会再次被CPU调用以进入到运行状态;

线程状态:

在这里插入图片描述

  • NEW : 线程刚刚创建,还没有启动
  • RUNNABLE : 可运行状态,由线程调度器可以安排执行(包括READY和RUNNING两种细分状态)
  • WAITING: 等待被唤醒
  • TIMED WAITING: 隔一段时间后自动唤醒
  • BLOCKED: 被阻塞,正在等待锁
  • TERMINATED: 线程结束

根据阻塞产生的原因不同,阻塞状态又可以分为三种:

  • a) 等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;
  • b) 同步阻塞:线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;
  • c) 其他阻塞:通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
  1. 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

线程阻塞api:

常用方法:

  • sleep()方法
    该方法允许指定以ms为单位的一段时间作为参数, 它使得线程在指定的时间内进入阻塞状态,不能得到CPU时间,
    指定时间已过,线程重新进入可执行状态.
  • suspend()和resume()方法
    配套使用, suspend()使得线程进入阻塞状态,且不会自动恢复,必须将其对应的resume()调用, 才可以使线程进入可执行状态.
  • yield()
    使得线程放弃当前分得的CPU时间, 但是不使线程阻塞, 即线程仍然处于可执行状态;
  • wait()和notify()方法
    配套使用,若wait()有参数,相当于sleep(但可以通过notify强行唤醒), wait()没有参数,相当于suspend(), 需要通过notify唤醒

sleep(0)和sleep(1)和不要sleep的区别:

sleep(0)

  • 如果线程调度器的可运行队列中有大于或等于当前线程优先级的就绪线程存在,操作系统会将当前线程从处理器上移除,调度其他优先级高的就绪线程运行;如果可运行队列中的没有就绪线程或所有就绪线程的优先级均低于当前线程优先级,那么当前线程会继续执行,就像没有调用Sleep(0)一样。

Sleep(1)

  • 会引发线程上下文切换:调用线程会从线程调度器的可运行队列中被移除一段时间,这个时间段约等于 timeout 所指定的时间

线程的优先级

线程的调度

在这里插入图片描述

优先级

在这里插入图片描述
在这里插入图片描述

线程状态案例:

在这里插入图片描述

线程状态:

  • NEW : 线程刚刚创建,还没有启动
  • RUNNABLE : 可运行状态,由线程调度器可以安排执行(包括READY和RUNNING两种细分状态)
  • WAITING: 等待被唤醒
  • TIMED WAITING: 隔一段时间后自动唤醒
  • BLOCKED: 被阻塞,正在等待锁
  • TERMINATED: 线程结束
只有synchronized才会造成BLOCKED状态,其余方法都是WAITING,或者TIMED WAITING
synchronized 是在队列中等待

案例:

package c_000_threadbasic;

import util.SleepHelper;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.LockSupport;
import java.util.concurrent.locks.ReentrantLock;

public class T04_ThreadState {
    public static void main(String[] args) throws Exception {
        //===================================================
        Thread t1 = new Thread(() -> {
            System.out.println("2: " + Thread.currentThread().getState());
            for (int i = 0; i < 3; i++) {
                SleepHelper.sleepSeconds(1);
                System.out.print(i + " ");
            }
            System.out.println();
        });
        System.out.println("1: " + t1.getState());
        t1.start();
        t1.join();
        System.out.println("3: " + t1.getState());

        //===================================================
        Thread t2 = new Thread(() -> {
            try {
                LockSupport.park();
                System.out.println("t2 go on!");
                TimeUnit.SECONDS.sleep(5);

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        t2.start();
        TimeUnit.SECONDS.sleep(1);
        System.out.println("4: " + t2.getState());

        LockSupport.unpark(t2);
        TimeUnit.SECONDS.sleep(1);
        System.out.println("5: " + t2.getState());

        //===================================================
        final Object o = new Object();
        Thread t3 = new Thread(() -> {
            synchronized (o) {
                System.out.println("t3 得到了锁 o");
            }
        });

        new Thread(() -> {
            synchronized (o) {
                SleepHelper.sleepSeconds(5);
            }
        }).start();

        SleepHelper.sleepSeconds(1);

        t3.start();
        SleepHelper.sleepSeconds(1);
        System.out.println("6: " + t3.getState());

        //===================================================
        final Lock lock = new ReentrantLock();
        Thread t4 = new Thread(() -> {
            lock.lock(); //省略try finally
            System.out.println("t4 得到了锁 o");
            lock.unlock();
        });

        new Thread(() -> {
            lock.lock();
            SleepHelper.sleepSeconds(5);
            lock.unlock();
        }).start();

        SleepHelper.sleepSeconds(1);

        t4.start();
        SleepHelper.sleepSeconds(1);
        System.out.println("7: " + t4.getState());

        //===================================================
        Thread t5 = new Thread(() -> {
            LockSupport.park();
        });

        t5.start();

        SleepHelper.sleepSeconds(1);

        System.out.println("8: " + t5.getState());
        LockSupport.unpark(t5);

    }

}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
软件简介: 现代人常有失眠、入睡难、睡觉不踏实、入睡不深、怯恐症、焦虑症、强迫症、抑郁性神经症、适应障碍、厌学、迷恋游戏、心理创伤、交际障碍、神经疼痛、神经衰弱、神经性头痛、先天性神经衰弱等症状。 本软件采用催眠疗法的机理,可产生大自然的背景声,配合同步产生的的α波,让你的心情因其美妙动听的旋律和充满大自然的声音产生一种莫名的安宁,从而让自己的心理进入一种轻松缥缈的境地。这种心理对有以上症状的人非常有益,可以让人的精神彻底放松,享受清净。从而在这种状态中静静入睡,睡眠质量将得到很大改善。 本版是绿色破解版,无使用限制。可以自由添加睡眠音乐和任意设定关机时间。不想使用软件播放音乐,也可将音乐拷贝到MP3播放器中使用。 催眠音乐说明: 睡眠是每个人在生命中都必须满足的一种绝对需要,就像食物和水一样。科学证明:人只要缺乏睡眠,失眠或是睡眠质量不高,就会变得坐立不安,情绪波动,记忆力减退,判断能力下降,甚至出现一些错觉和幻觉,以致难以坚持日常生活和活动。人的一生当中大约有三分之一的时间用于睡眠,所以,睡眠对每个人来讲,都是不可或缺的生命需要。 婴儿睡眠不足,不但影响身体生长,而且有可能影响大脑的正常发育。成年人睡眠不足,不仅影响其体力恢复,更不利于心理健康。老年人睡眠不足,可能加速脑的衰老。 失眠:通常指患者对睡眠时间和或质量不满足并影响白天社会功能的一种主观体验。 1. 入睡困难 2. 不能熟睡 3. 早醒、醒后无法再入睡 4. 睡过之后精力没有恢复 5. 容易被惊醒,有的对声音敏感,有的对灯光敏感 ...... 失眠会引起人的疲劳感、不安、全身不适、无精打采、反应迟缓、头痛、记忆力不集中,它的最大影响是精神方面的,严重一点会导致精神分裂。 人生在世,五谷杂粮,巨大的社会竞争,纷繁的生活压力,复杂的情感纠葛......没有人可以彻底摆脱曾经失眠以及睡眠质量欠佳的困扰。也许现在暂时没有,但是将来谁也无法确保不发生。 本音乐向渴望健康睡眠的人们,提供了进入深度睡眠的有效办法。旋律轻柔、乐音委婉,营造特别的安然气氛,帮助失眠者克服不利睡眠的因素,是提升睡眠质量的最佳音疗选择。让充满活力的朝气重新恢复,让所有内在积压的压力与倦怠彻底的排遣。 美国音乐治疗协会,推荐休闲治疗方式。睡出谧静和天然朝气!都市纷繁复杂的快节奏,带来长期慢性疲劳和精神紧张,多久没有好好的睡上一个好觉了,暂且放下一切的执着,让音乐重新帮你找回失去已久的自然睡眠,静静的享受婴儿般深度睡眠的乐趣......在甜美的梦乡中再次遇到久违的白马王子和天使。 提示: 1.除可促进睡眠,亦可作为日常放松、休闲、静心、伴读等之聆听,宛若仙境、效果甚佳。 2.睡眠音乐开始作用不会显著,因为聆听者最初不熟悉音乐的旋律,总是好奇感居多,总是听音乐的心理多于疗效的心理,故初始较难进入意境状态,时间长了就会好的,才会体现音乐的作用。 3.睡眠音乐不能总听一个专辑,如同洗发水一样,总用一个牌子就会对去头屑产生抗体。音乐亦是如此,睡眠音乐应该在尽可能的情况下,通过实践找到几个适合自己静心放松的不同韵律专辑,轮换聆听,才会更加相得益彰。 4. 值得一提的是,本专辑CD1只有三首曲目,故每首曲目时间都相对较长,比如第1曲就有近30分钟的时间。实验证明,很多人在真正静心放松时,还未听完第一曲就已经进入了梦境。因此如果伴以入眠,家中无人时,请注意设置好播放器的定时功能,预防以免损耗机器及浪费电能的发生。 音乐目录: 1.舞随光动 Dancing with the Neon Light 2.深蓝梦 Dream in Dark Blue 3.心灵感悟 Sentiment of My Heart 4.细水长流 Running Water in the Long Rill 5.花絮轻撒 Rose Petal Floating 6.爱的轮回 Love is Around 7.月影摇曳 Shadow Shaking in the Moonlight 8.逐梦 Catching Dreams 9.萦绕天使 Angel Flying Around 10.夜宴 Deep Night

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值