线程状态


目录

  • 线程状态
    • 1、 五大状态
    • 2、线程方法
    • 3、停止线程
    • 4、线程休眠
    • 5、线程礼让
    • 6、Join
    • 7、线程状态观测
    • 8、线程优先级
    • 9、守护(daemon)线程

1、 五大状态

五大状态

线程状态转换

2、线程方法

3、停止线程

停止线程

  • 不推荐使用JDK提供的 stop()、 destroy()方法。【已废弃】
  • 推荐线程自己停止下来
  • 建议使用一个标志位进行终止变量 ,当flag=false,则终止线程运行。

代码

package com.kaung.state;public class TestStop implements Runnable{//1.设置一个标识位private  boolean flag = true;@Overridepublic void run() {int i = 0;while(flag){System.out.println("run.....Thread"+i++);}}//2.设置一个公开的方法停止线程,转换标志位public void stop(){this.flag = false;}public static void main(String[] args) {TestStop testStop = new TestStop();new Thread(testStop).start();for (int i = 0; i < 1000; i++) {System.out.println("main"+i);if(i==900){//调用stop方法切换标志位,让线程停止testStop.stop();System.out.println("线程停止了");}}}
}

运行截图

4、线程休眠

线程休眠

  • sleep (时间) 指定当前线程阻塞的毫秒数; 1000 ms = 1s

  • sleep存在异常InterruptedException;

  • sleep时间达到后线程进入就绪状态;

  • sleep可以模拟网络延时,倒计时等。

  • 每一个对象都有一个锁,sleep不会释放锁;

演示代码

模拟网络延时:放大问题的发生性。

package com.kaung.state;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.SimpleFormatter;//模拟倒计时
public class TestSleep {public static void main(String[] args) {//打印系统当前时间Date startTime = new Date(System.currentTimeMillis()); //获取系统当前时间while(true){try {Thread.sleep(1000);System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));startTime = new Date(System.currentTimeMillis()); //更新时间} catch (InterruptedException e) {e.printStackTrace();}}}//模拟倒计时public static void tenDown() throws InterruptedException {int num = 10;while(true) {Thread.sleep(1000);System.out.println(num--);if(num<=0){break;}}}
}

5、线程礼让

线程礼让

  • 礼让线程,让当前正在执行的线程暂停,但不阻塞

  • 将线程从运行状态转为就绪状态

  • 让cpu重新调度,礼让不一定成功!看CPU心情

代码模拟

package com.kaung.state;public class TestYield {public static void main(String[] args) {MyYield myYield = new MyYield();new Thread(myYield,"a").start();new Thread(myYield,"b").start();}
}class MyYield implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"线程开始执行");Thread.yield();//线程礼让System.out.println(Thread.currentThread().getName()+"线程停止执行");}
}

运行截图

总结

礼让不一定成功,需要看cpu心情。

6、Join

Join

  • Join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞

  • 可以想象成插队

    代码模拟

package com.kaung.state;//测试join方法,想象成插队
public class TestJoin implements Runnable{@Overridepublic void run() {for (int i = 0; i < 1000; i++) {System.out.println("线程VIP来了"+i);}}public static void main(String[] args) throws InterruptedException {//启动我们的线程TestJoin testJoin = new TestJoin();Thread thread = new Thread(testJoin);thread.start();for (int i = 0; i < 500; i++) {if(i==200){thread.join();}System.out.println("main"+i);}}
}

运行截图

7、线程状态观测

JDk帮助文档

观察线程状态

package com.kaung.state;//观测线程的状态
public class TestState {public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(()->{for (int i = 0; i < 5; i++) { //让线程睡眠5stry {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("///");});//观察状态Thread.State state = thread.getState();System.out.println(state); //NEWthread.start();//启动线程state = thread.getState();System.out.println(state); //RUNwhile(state != Thread.State.TERMINATED){ //只要线程不停止,就一直输出状态Thread.sleep(100);state = thread.getState();System.out.println(state);}}
}

运行截图

线程一旦进入死亡状态,就不能再次启动了。

8、线程优先级

线程优先级

  • Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行。

  • 线程的优先级用数字表示,范围从1~10.

    • Thread.MIN_PRIORITY = 1;

    • Thread.MAX_PRIORITY = 10;

    • Thread.NORM_PRIORITY = 5;

  • 使用以下方式改变或获取优先级

    • getPriority() . setPriority(int xxx)

优先级的设定建议在start()调度前

代码

package com.kaung.state;//测试线程的优先级
public class TestPriority {public static void main(String[] args) {//主线程默认优先级System.out.println(Thread.currentThread().getName()+"-->"+Thread.currentThread().getPriority());MyPriority myPriority = new MyPriority();Thread t1 = new Thread(myPriority,"t1");Thread t2 = new Thread(myPriority,"t2");Thread t3 = new Thread(myPriority,"t3");Thread t4 = new Thread(myPriority,"t4");//先设置线程的优先级,再启动t1.start();t2.setPriority(1);t2.start();t3.setPriority(4);t3.start();t4.setPriority(Thread.MAX_PRIORITY); //MAX_PRIORITY = 10t4.start();}
}class MyPriority implements Runnable{@Overridepublic void run() {//获取线程的优先级System.out.println(Thread.currentThread().getName()+"-->"+Thread.currentThread().getPriority());}
}

运行截图

总结

优先级低只是意味着获得调度的概率低,并不是优先级低就不会被调用了,这都是看CPU的调度

9、守护(daemon)线程

守护(daemon)线程

  • 线程分为用户线程守护线程

  • 虚拟机必须确保用户线程执行完毕

  • 虚拟机不用等待守护线程执行完毕

  • 如,后台记录操作日志,监控内存,垃圾回收等待…


代码模拟

package com.kaung.state;//测试守护线程
//上帝守护你
public class TestDaemon {public static void main(String[] args) {God god = new God();You you = new You();Thread thread = new Thread(god);thread.setDaemon(true); //默认是false表示的是用户线程,正常的线程都是用户线程thread.start();//上帝守护线程启动new Thread(you).start(); //你 用户线程启动...}
}//上帝
class God implements Runnable{@Overridepublic void run() {while(true){System.out.println("上帝守护你!");}}
}//你
class You implements Runnable{@Overridepublic void run() {for (int i = 0; i < 36500; i++) {System.out.println("你一生都开心的活着");}System.out.println("======goodbye world!======"); //hello world}
}

运行结果

多线程详解系列文章目录

多线程详解第1讲:线程简介

多线程详解第2讲:线程实现(重点)

多线程详解第3讲:线程状态

多线程详解第4讲:线程同步(重点)

多线程详解第5讲:线程协作

多线程详解第3讲:线程状态相关推荐

  1. 多线程详解第1讲:线程简介

    此笔记为 [狂神说Java]多线程详解 听课笔记 B站视频链接 [狂神说Java]多线程详解 ,狂神讲解的多线程非常通俗易懂,建议大家可以配合此笔记听课. 目录 线程简介 1.多任务 2.多线程 3. ...

  2. Java 多线程详解(五)------线程的声明周期

    Java 多线程详解(一)------概念的引入:https://blog.csdn.net/weixin_39816740/article/details/80089790 Java 多线程详解(二 ...

  3. Java 多线程详解(三)------线程的同步

    Java 多线程详解(一)------概念的引入:https://blog.csdn.net/weixin_39816740/article/details/80089790 Java 多线程详解(二 ...

  4. 图文详解jvm中的线程状态

    本文使用下面这张图详细介绍JAVA线程的六种状态 JAVA线程的六种状态详解 在java.lang.Thread类中,定义了线程的以下六种状态(同一个时刻线程只能有一种状态)  NEW(新建) 这个状 ...

  5. Java多线程详解(如何创建线程)

    嗨喽-小伙伴们我们又见面了, 前面一章,我们了解了线程的基本概念,从这一章,我们开始学习如何创建一个线程.总的说来,在java中,有四种创建线程的方式: 1. 继承Thread类 2. 实现Runna ...

  6. Java多线程详解(线程不安全案例)

    嗨喽-小伙伴们我又来了, 通过前面两章的学习,我们了解了线程的基本概念和创建线程的四种方式. 附上链接: 1.  Java多线程详解(基本概念)​​​​​​​ 2. Java多线程详解(如何创建线程) ...

  7. iOS多线程详解:实践篇

    iOS多线程实践中,常用的就是子线程执行耗时操作,然后回到主线程刷新UI.在iOS中每个进程启动后都会建立一个主线程(UI线程),这个线程是其他线程的父线程.由于在iOS中除了主线程,其他子线程是独立 ...

  8. Java多线程详解(基本概念)

    嗨喽-小伙伴们我来啦, 从本章开始,我们就要开始介绍Java中一个非常重要的概念-----多线程.线程化思想是计算机领域的重要思想,有了线程,咱编写的程序才能更为高效准确地运行起来. 首先,咱来了解一 ...

  9. Java 多线程详解(四)------生产者和消费者

    Java 多线程详解(一)------概念的引入:https://blog.csdn.net/weixin_39816740/article/details/80089790 Java 多线程详解(二 ...

最新文章

  1. MySQL FEDERATED引擎使用示例, 类似Oracle DBLINK
  2. Winform开发框架之肖像显示保存控件的实现
  3. mybaits十四:使用if和where标签构建动态sql
  4. python3反转字符串的3种方法
  5. MFC中获取命令行参数的几种方法
  6. 『设计模式』难道你现在还不知道:C/S和B/S
  7. dbgrideh 为什么只一行_Mysql性能优化:为什么count(*)这么慢?
  8. rocketmq 消息指定_SpringBoot 整合 RocketMQ 如何实现消息生产消费?
  9. putty远程linux系统时间修改,用putty怎么修改监控服务器时间?
  10. Activity与Fragment间的通信
  11. Mongodb 定时备份和恢复 1
  12. PDManer数据库建模工具介绍
  13. 数学表达式基础——2 集合、向量与矩阵
  14. XCode9插件安装,XCode9.2插件安装,XCode8和XCode9的Alcatraz安装
  15. A/Btest:组间的差异性检验,统计功效以及反选样本量,附python底层实现代码
  16. Python-实现根据关键词获取网页内容
  17. FIRST集合、FOLLOW集合以及LL(1)文法
  18. 数据结构c语言版第三版实验四答案,数据结构(C语言版)第三四章习题答案
  19. oracle 磁盘组掉了,Oracle 11g RAC ASM磁盘全部丢失后的恢复(一)
  20. 英语学习之沪江整理 20141101

热门文章

  1. HTML5+CSS3小实例:炫彩的发光字特效
  2. 腾讯数据库TcaplusDB十年厚积薄发,已是参天大树
  3. Python零基础自学要多久?编程入门该怎么学?
  4. iso20000和iso9001的区别
  5. 写个html下载swf
  6. 哪款远程控制软件可以远程玩游戏?
  7. 从原理到代码:大牛教你如何用 TensorFlow 亲手搭建一套图像识别模块 | AI 研习社...
  8. 踏浪前行 ——读《浪潮之巅》
  9. 数据挖掘项目笔记——使用joblib中的Parallel并行运行程序
  10. [福利]如何下载Tumblr的视频