多线程详解第3讲:线程状态
线程状态
目录
- 线程状态
- 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讲:线程简介
此笔记为 [狂神说Java]多线程详解 听课笔记 B站视频链接 [狂神说Java]多线程详解 ,狂神讲解的多线程非常通俗易懂,建议大家可以配合此笔记听课. 目录 线程简介 1.多任务 2.多线程 3. ...
- Java 多线程详解(五)------线程的声明周期
Java 多线程详解(一)------概念的引入:https://blog.csdn.net/weixin_39816740/article/details/80089790 Java 多线程详解(二 ...
- Java 多线程详解(三)------线程的同步
Java 多线程详解(一)------概念的引入:https://blog.csdn.net/weixin_39816740/article/details/80089790 Java 多线程详解(二 ...
- 图文详解jvm中的线程状态
本文使用下面这张图详细介绍JAVA线程的六种状态 JAVA线程的六种状态详解 在java.lang.Thread类中,定义了线程的以下六种状态(同一个时刻线程只能有一种状态) NEW(新建) 这个状 ...
- Java多线程详解(如何创建线程)
嗨喽-小伙伴们我们又见面了, 前面一章,我们了解了线程的基本概念,从这一章,我们开始学习如何创建一个线程.总的说来,在java中,有四种创建线程的方式: 1. 继承Thread类 2. 实现Runna ...
- Java多线程详解(线程不安全案例)
嗨喽-小伙伴们我又来了, 通过前面两章的学习,我们了解了线程的基本概念和创建线程的四种方式. 附上链接: 1. Java多线程详解(基本概念) 2. Java多线程详解(如何创建线程) ...
- iOS多线程详解:实践篇
iOS多线程实践中,常用的就是子线程执行耗时操作,然后回到主线程刷新UI.在iOS中每个进程启动后都会建立一个主线程(UI线程),这个线程是其他线程的父线程.由于在iOS中除了主线程,其他子线程是独立 ...
- Java多线程详解(基本概念)
嗨喽-小伙伴们我来啦, 从本章开始,我们就要开始介绍Java中一个非常重要的概念-----多线程.线程化思想是计算机领域的重要思想,有了线程,咱编写的程序才能更为高效准确地运行起来. 首先,咱来了解一 ...
- Java 多线程详解(四)------生产者和消费者
Java 多线程详解(一)------概念的引入:https://blog.csdn.net/weixin_39816740/article/details/80089790 Java 多线程详解(二 ...
最新文章
- MySQL FEDERATED引擎使用示例, 类似Oracle DBLINK
- Winform开发框架之肖像显示保存控件的实现
- mybaits十四:使用if和where标签构建动态sql
- python3反转字符串的3种方法
- MFC中获取命令行参数的几种方法
- 『设计模式』难道你现在还不知道:C/S和B/S
- dbgrideh 为什么只一行_Mysql性能优化:为什么count(*)这么慢?
- rocketmq 消息指定_SpringBoot 整合 RocketMQ 如何实现消息生产消费?
- putty远程linux系统时间修改,用putty怎么修改监控服务器时间?
- Activity与Fragment间的通信
- Mongodb 定时备份和恢复 1
- PDManer数据库建模工具介绍
- 数学表达式基础——2 集合、向量与矩阵
- XCode9插件安装,XCode9.2插件安装,XCode8和XCode9的Alcatraz安装
- A/Btest:组间的差异性检验,统计功效以及反选样本量,附python底层实现代码
- Python-实现根据关键词获取网页内容
- FIRST集合、FOLLOW集合以及LL(1)文法
- 数据结构c语言版第三版实验四答案,数据结构(C语言版)第三四章习题答案
- oracle 磁盘组掉了,Oracle 11g RAC ASM磁盘全部丢失后的恢复(一)
- 英语学习之沪江整理 20141101