线程的状态

news/2024/10/18 3:32:36/

目录

1.线程的几种状态

2.TERMINATED状态

3.获取线程的状态

4.线程存在的意义


1.线程的几种状态

(1) NEW : 线程对象已经存在,但是线程没有启动

(2) RUNNABLE :  线程正在CPU上运行,或者可以在CPU上运行(就绪状态)

(3) TIME_WAITING : 线程当前处于堵塞状态.(wait/join)

(4) WAITING : 线程当前处于堵塞状态.(sleep)

(5) BLOCKED : 线程当前处于堵塞状态.(加锁操作)

(6) TERMINATED : 线程被释放,但是线程对象还在

线程图大致如下:

2.TERMINATED状态

为什么TERMINATED状态时,线程都已经回收了,对象不进行回收呢?

在Java中,一个线程对象只可以start一次,通常来讲,一个线程已经不存在了,那么线程对象也就没有作用了,之所以不同步将对象销毁,是因为Java对象的声明周期自有它的规则,这个生命周期和系统内核里面的线程并非完全一致,所以,内核的线程释放的时候,无法保证Java代码中的t对象也立即释放.

此时就需要一个特定的状态将t对象设置成"无效"(里面的属性方法还可以使用),因此一个线程只能start一次.

3.获取线程的状态

获取线程状态的方法是getStart(),是属性方法

可以观察以下代码的线程状态:

public class StartDemo1 {public static long count = 0;public static void main(String[] args) {Thread t = new Thread(() -> {for(int i = 0;i <100;i++) {try {Thread.sleep(15);} catch (InterruptedException e) {e.printStackTrace();}}});System.out.println("执行前状态: " + t.getState());t.start();for(int i = 0;i < 100;i++) {System.out.println("执行中状态: " + t.getState());}try {t.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("执行结束: " + t.getState());}
}

我们在main线程中创建了一个新的线程,这个新的线程的执行内容很简单,进入一个循环,执行100次的sleep(15),这个线程除了需要对循环条件的判断和对循环变量的自增之外,就只需要sleep.

同时在main线程中,执行完t.start之后,我们对t线程的状态进行100次的打印.

对计算机来说,15毫秒的时间是非常长的,因此,我们的打印结果绝大多数都是TIME_WAITING的状态,执行结果如下(结果太长,只截取一部分):

由上面这个代码可以观察到线程状态的交替.

4.线程存在的意义

通过下面的代码可以观察到多线程与单线程的区别

public class StartDemo2 {public static void main(String[] args) {serial();state();}public static long a = 0;public static long b = 0;public static void state() {long beg = System.currentTimeMillis();Thread t1 = new Thread(() -> {for(long i = 0;i < 100_0000_0000L;i++) {a++;}});Thread t2 = new Thread(() -> {for(long i = 0;i < 100_0000_0000L;i++) {b++;}});t1.start();t2.start();try {t1.join();t2.join();} catch (InterruptedException e) {throw new RuntimeException(e);}long end = System.currentTimeMillis();System.out.println("多线程消耗的时间: " + (end - beg) + "ms");}public static void serial() {long beg = System.currentTimeMillis();long a = 0;for(long i = 0;i < 100_0000_0000L;i++) {a++;}long b = 0;for(long i = 0;i < 100_0000_0000L;i++) {b++;}long end = System.currentTimeMillis();System.out.println("单线程消耗的时间: " + (end - beg) + "ms");}
}

 通过运行的结果可以看出,多线程时间消耗要比单线程的时间消耗少很多,但是为什么两个线程却不是减半的效果呢?

因为线程如何调度是操作系统内核决定的,如果使用并行(两个内核执行两个线程),那么效果就是事半功倍,如果使用并发(一个内核执行两个线程),那么和单线程也没有区别了,当然即使全部都是并行,也不会出现减半的效果,因为线程在调度时也会有时间的损耗,并且,如果电脑上运行的程序过多,导致CPU的核心被占满了,那么再多的线程也没有用,因为根本无法支持并行的状态运行.


http://www.ppmy.cn/news/768.html

相关文章

四嗪-五聚乙二醇-羧基,1682653-79-7,Tetrazine-PEG5-COOH 水溶性和稳定性怎么样?

●中文名&#xff1a;四嗪-五聚乙二醇-羧基 ●英文&#xff1a;Tetrazine-PEG5-COOH ●外观以及性质&#xff1a;Tetrazine-PEG5-COOH为红色固体&#xff0c;四嗪目前被广泛应用于蛋白质特定位点功能阐释、亚细胞结构选择性标记。四嗪PEG衍生物用于与 TCO&#xff08;反式环辛烯…

网页大作业代码自取

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

详解设计模式:享元模式

享元模式&#xff08;Flyweight Pattern&#xff09;&#xff0c;是对象池的一种体现&#xff0c;也是 GoF 的 23 种设计模式中的一种结构型设计模式。 享元模式 主要用于减少创建对象的数量&#xff0c;以减少内存占用和提高性能。它提供了减少对象数量从而改善应用所需的对象…

「PAT乙级真题解析」Basic Level 1101 B是A的多少倍 (问题分析+完整步骤+伪代码描述+提交通过代码)

乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。 PAT (Basic Level) Practice 1101 B是A的多少倍 问题分析 题设明确要求按照其给定的步骤变换给定的正整数, 然后输出变换后的正整数是输入正整数的多少倍。 所…

LeetCode 刷题系列 -- 1425. 带限制的子序列和

给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回 非空 子序列元素和的最大值&#xff0c;子序列需要满足&#xff1a;子序列中每两个 相邻 的整数 nums[i] 和 nums[j] &#xff0c;它们在原数组中的下标 i 和 j 满足 i < j 且 j - i < k 。 数组的子序列定义为…

crm客户管理系统为企业带来的价值

简道云CRM场景套件对中小企业来说&#xff0c;crm客户管理系统最核心的作用&#xff0c;一是客户信息(联系信息和洽谈过程&#xff09;的存留&#xff0c;不会因为业务人员的离职造成流失&#xff0c;这点对老板很重要。二是可帮助业务人员&#xff08;客户获取、主管指导等&am…

HTML+CSS+JavaScript仿京东购物网站制作 html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

Spring Cloud教程 第十二弹 Spring Cloud Config整合Spring Cloud Bus实现配置动态刷新

Spring Cloud Config整合Spring Cloud Bus1、回顾2、手动刷新3、Spring Cloud Bus动态刷新配置1、回顾 在上一弹&#xff1a;Spring Cloud教程 第十一弹 Spring Cloud Config连接git和数据库 中介绍了spring cloud config的基本使用&#xff0c;但是配置无法动态刷新&#xff…