线程的生命周期

1、 补充

Java中的线程分为两类:守护线程、用户线程(默认)。

它们几乎在每个方面都是相同的,唯一的区别是判断JVM何时离开。意思就是,只要当前JVM实例中尚存任何一个非守护线程没有结束,守护线程就全部工作

守护线程是用来服务用户线程的,通过在start() 方法前调用Thread.setDaemon(true) 可以把一个用户线程变成一个守护线程。

2、 JDK中用Thread.State枚举表示线程的六种状态

在枚举类 Thread.State 中共有六种状态

代码验证

public void sixThreadState() throws Exception {// 第一种状态切换 - 新建 -> 运行 -> 终止System.out.println("############第一种状态切换:新建 -> 运行 -> 终止################################");Thread thread1 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("thread1当前状态:" + Thread.currentThread().getState().toString());System.out.println("thread1 执行了");}});System.out.println("没调用start方法,thread1当前状态:" + thread1.getState().toString());thread1.start();Thread.sleep(2000L); // 等待thread1执行结束,再看状态System.out.println("等待两秒,再看thread1当前状态:" + thread1.getState().toString());try {thread1.start();} catch (Exception e) {System.out.println("线程终止之后,再进行调用,会抛出IllegalThreadStateException异常");}System.out.println();System.out.println("############第二种:新建 -> 运行 -> 等待 -> 运行 -> 终止(sleep方式)###########################");Thread thread2 = new Thread(new Runnable() {@Overridepublic void run() {try {// 将线程2移动到等待状态,1500后自动唤醒Thread.sleep(1500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("thread2当前状态:" + Thread.currentThread().getState().toString());System.out.println("thread2 执行了");}});System.out.println("没调用start方法,thread2当前状态:" + thread2.getState().toString());thread2.start();System.out.println("调用start方法,thread2当前状态:" + thread2.getState().toString());Thread.sleep(200L); // 等待200毫秒,再看状态System.out.println("等待200毫秒,再看thread2当前状态:" + thread2.getState().toString());Thread.sleep(3000L); // 再等待3秒,让thread2执行完毕,再看状态System.out.println("等待3秒,再看thread2当前状态:" + thread2.getState().toString());System.out.println();System.out.println("############第三种:新建 -> 运行 -> 阻塞 -> 运行 -> 终止###########################");Thread thread3 = new Thread(new Runnable() {@Overridepublic void run() {synchronized (SixThreadStateTest.class) {System.out.println("thread3当前状态:" + Thread.currentThread().getState().toString());System.out.println("thread3 执行了");}}});synchronized (SixThreadStateTest.class) {System.out.println("没调用start方法,thread3当前状态:" + thread3.getState().toString());thread3.start();System.out.println("调用start方法,thread3当前状态:" + thread3.getState().toString());Thread.sleep(200L); // 等待200毫秒,再看状态System.out.println("等待200毫秒,再看thread3当前状态:" + thread3.getState().toString());}Thread.sleep(3000L); // 再等待3秒,让thread3执行完毕,再看状态System.out.println("等待3秒,让thread3抢到锁,再看thread3当前状态:" + thread3.getState().toString());
}

解决窗口售票的问题

问题:票数里面出现重票0票和**-1**票。

大家肯定想到了一个解决方案:将票数存到另外一个数组里面,输出之前判断票数是否大于等于1,是否与数组里面的每一个元素相同。

先分析一下出现BUG的原因:

三个窗口(一号、二号、三号)线程同时操作同一个票数这个数据的时候,一号线程在操作这个数据的时候,还没有执行完,二号线程就已经开始执行了,形成了一种“抢”的状态,于是出现了数据共享的安全问题。

解决方案就是你想的那样:就如同上公共厕位大便一样,这个人解决完了,另外一个人才能进去。

代码有两种调整方式为线程的同步:同步代码块、同步方法。请继续阅读下文。

Java并发 - 线程的生命周期相关推荐

  1. java中线程的生命周期

    文章目录 java中Thread的状态 NEW Runnable BLOCKED WAITING TIMED_WAITING TERMINATED java中线程的生命周期 线程是java中绕不过去的 ...

  2. java中线程的生命周期_Java中的线程生命周期– Java中的线程状态

    java中线程的生命周期 Understanding Thread Life Cycle in Java and Thread States are very important when you a ...

  3. Java 多线程— 线程的生命周期及方法

    2019独角兽企业重金招聘Python工程师标准>>> 这篇博客介绍线程的生命周期. 线程是一个动态执行的过程,它也有从创建到死亡的过程. 线程的几种状态 在 Thread 类中,有 ...

  4. Java中线程的生命周期-图解

    线程的生命周期:当一个线程被创建之后,进入新建状态,JVM则给他分配内存空间,并进行初始化操作.当线程对象调用了start()方法,该线程就处于就绪状态(可执行状态),JVM会为其创建方法调用栈.和程 ...

  5. java并发编程基础—生命周期与线程控制

    一.线程生命周期 线程被创建启动以后,他既不是一启动就进入执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New).就绪(Runnable).运行(Running).阻塞(Bloc ...

  6. 11.3-全栈Java笔记:线程的生命周期

    一个线程对象在它的生命周期内,需要经历5个状态. 新生状态(New) 用new关键字建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态 ...

  7. java for(o t :object) 获取顺序号_java中线程的生命周期

    线程是java中绕不过去的一个话题, 今天本文将会详细讲解java中线程的生命周期,希望可以给大家一些启发. java中Thread的状态 java中Thread有6种状态,分别是: NEW – 新创 ...

  8. java 线程僵死_线程的生命周期?什么时候会出现僵死进程?

    线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 新建(new Thread) 当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动).例 ...

  9. 线程的生命周期其实没有我们想象的那么简单!!

    来自:冰河技术 写在前面 在[高并发专题]中的<高并发之--线程与多线程>一文中,我们简单介绍了线程的生命周期和线程的几个重要状态,并以代码的形式实现了线程是如何进入各个状态的.今天,我们 ...

最新文章

  1. 电子病历开发经验共享 —— 2009年一时兴起写在某个论坛上的,转抄留恋。
  2. 刚刚,阿里云上线六大“战疫情”项目
  3. Springboot项目部署到外部Tomcat
  4. 360公司2019秋季校园招聘内部推荐启动啦!!!
  5. Lightroom Classic 教程,如何在 Lightroom 中裁剪并修齐照片?
  6. 计算机领域男的多大年龄退休,2022年后男性几岁退休 2022退休时间表
  7. 费马定理中值定理_长盛不衰的法国数学|费马
  8. 单片机音乐倒数计时器c语言,基于单片机音乐倒数计时器设计.doc
  9. 迪普科技负载均衡助力金关工程(二期)核心业务交付
  10. 基于区块链技术的航运贸易流程研究
  11. Travis CI 持续集成工具 教程
  12. CAD2006提示没有足够的权限来安装此产品
  13. Android自定义WebView实现Youtube网络视频播放控件
  14. JavaScript练习题四
  15. JS格式化输出常用格式
  16. [转]Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
  17. 微信小程序解密失败的可能原因
  18. 面对职场“毕业”,PMPMO应该如何从容的应对?如何跳槽能够大幅度升职加薪?【大海午餐】
  19. 那些年解的疑难性能问题 --- ext4碎片整理
  20. c语言的中打印出鸟图形,教你画出一只萌萌哒小鸟【PS教程】

热门文章

  1. go 变量与json相互转换
  2. 国庆锦鲤大礼包,还不Pick一下~
  3. 手把手教你如何PCB板材选型(一)
  4. 操作系统的功能是提高计算机的运行速度吗,Win10系统提高电脑运行速度的具体操作方法...
  5. 程序员应该有的一些好习惯!
  6. php 将数字转为大写,将数字小写转为大写 php
  7. Android 7.1 高德导航和蓝牙音乐卡顿问题 蓝牙电话和高德语音播报混音问题
  8. jQuery实现消息提示框
  9. Sprite Kit教程
  10. 数据结构之树的相关名字解释