线程创建方式、构造方法和线程属性

news/2024/5/10 5:55:19

欢迎各位!!!推荐PC端观看

文章重点:学会五种线程的创造方式

目录

1.开启线程的五种方式

2.线程的构造方法

3.线程的属性及获取方法


1.开启线程的五种方式

创造线程的基本两步:(1)使用run方法记录线程要做的任务(2)使用线程的引用 调用start开启线程

1.1.继承Tread,重写run
class myThread extends Thread {@Overridepublic void run() {System.out.println("继承Thread,重写run");}
}
public class Func1 {public static void main(String[] args) {Thread t = new myThread();t.start();}
}

(1)Thread线程自己在run中记录了线程要做的任务

(2)main函数中通过t引用开启线程

1.2.实现Runnable,重写run
class myRunnable implements Runnable {@Overridepublic void run() {System.out.println("实现Runnable,重写run");}
}
public class Func2 {public static void main(String[] args) {myRunnable t = new myRunnable();Thread t2 = new Thread(t);t2.start();}
}

(1)实现Runnable接口,此时记录任务的是一个单独的类

(2)t开启线程之和,线程需要到前面的类中寻找线程任务

(3)相比第一种来说,安全性更高

1.3.继承Thread,使用匿名内部类

第一种写法的变形

 public static void main(String[] args) {Thread t = new Thread(){@Overridepublic void run() {System.out.println("继承Thread,使用匿名内部类");}};t.start();}

1.4.实现Runnable,使用匿名内部类

第二种写法的改进写法

 public static void main(String[] args) {Thread t = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("实现Runnable,使用匿名内部类");}});t.start();}

1.5.使用lambda表达式

 public static void main(String[] args) {Thread t= new Thread(()->{System.out.println("使用lambda表达式执行线程");});t.start();}

线程创造方式的推荐:第五种>第四种>三>二>一

1.6.查看多线程运行

6.1.直接通过代码观察

代码:

class myThread extends Thread {@Overridepublic void run() {while (true) {System.out.println("t线程ttttt");}}
}
public class demo1 {public static void main(String[] args) {Thread t = new myThread();t.start();while (true) {System.out.println("主线程9999");}}
}

运行结果:

6.2.通过jconsole.exe观察

(1)找到该文件位置

(2)运行代码后选择

(3)可以看到,此时线程正在运行。Thread-0就是我们自己创造的t线程,main线程是主线程,运行程序就会有

1.7.线程小结

(1)按照上面五种方式创建完线程之后,需要通过线程的引用开启线程。例如 t 就是一个线程引用,t.start()就是开启了该线程,后面会介绍该方法。

(2)前面的四种线程创造方法,都需要重写run,而使用lambda表达式不需要。其本质都是为了记录该线程的任务。等待t.start()后就会执行该任务

 

2.线程的构造方法

下面是一个Thread线程构造函数表

2.1.Thread()

这种构造方法,就是我们上面使用的第一种创造线程的方法,但是要发生向上转型,一般不会直接new;也可以是第五种

2.2.Thread(Runnable target)

这种也就是上述的第二种线程创造方式和第四种

(1)上述第二种

(2)上述第四种

 2.3.Thread(String name)

这种是给线程起名字

(1)没有给线程起名字时

当我们自己创建的线程没有起名字时,第一个线程默认为:Thread-0,第二个为:Thread-1,以此类推

(2)起了名字后

起名字的写法一般是后面几种创造线程的方式才可以

3.线程的属性及获取方法

下面是Thread常见的几个属性和获取方法

这里线程的一些属性,有些neri

3.1.ID

这里的id和pcb中的id不是同一个东西,但是都是唯一标识符。而且,在java代码中是无法获取到该属性,所以也就不过多叙述了。

3.2.名称

这里的名称也就是可以通过上面介绍的构造方法设置的。

通过getName()方法就可以找到该线程的名字

3.3.状态

线程的状态有五种:新建状态(NEW)、就绪状态(RUNNABLE)、运行状态(RUNNING)、阻塞状态(BLOCKED)、死亡状态(DEAD)

至于每种状态代表什么、是怎么来的、状态之间是怎么切换,我们这里不做介绍,后面会有专门一部分来叙述。

获取当前线程的状态:

3.4.优先级

实际上修改了优先级,但是现象也不明显。所以这里的修改优先级仅供参考,也就不做其他详细的介绍

3.5.是否后台线程(*)

(1)介绍后台线程和前台线程

前台:如main所在的主线程,前台线程不运行结束的话,java进程一定不会结束。而且前台线程有很多个,只有都结束了,Java程序才会结束

后台:这样的线程 对进程不起决定作用(也称为daemon,后台线程)

我们创造的线程和主线程都默认是前台线程。

(2)举例子说明前后台程序

举办酒席:主持人、官方人员和主人这些,我们记为前台程序;而像我们这些干饭人则称为后台线程。酒席是否结束我们就记为Java程序是否结束

(1)我们这些干饭人,吃完饭就直接走,不会影响酒席的结束与否

(2)当主持人这些前台程序宣布酒席到此结束的时候,酒席就会直接结束。即使干饭人的我没有吃完,也不能继续干饭了(后台程序也结束了)

(3)通过setDaemon方法可以把线程设置为后台线程

方法内默认加上true

如果不把t线程设置为后台线程,该程序是不会结束的 

(4)注意事项

线程的各种属性设置都要在start前面,否则报错

3.6是否存活(*)

 (1)是否存活:指的是系统中的线程(PCB)是否存在。而Thread对象的生命周期,和PCB的生命周期是不一定完全一样的。

(2)区别

他们的诞生的时间:

当线程创建出来的时候,pcb才会出现并且添加到链表上 

他们的结束的时间:

t线程一下子就执行完了,因此pcb的一下子就结束了;而t指向的Thread对象,因为sleep还没执行完,因此还没被GC回收

他们的第二种结束时间:

这种写法,t线程里面会休眠一段时间才会结束,而Thread对象一下子就被GC回收了。

结论:说明他们之间没有什么关系,无法真正的判断线程是否结束了,所以可以通过isAlive()方法判断当前的线程是否还存货。

(3)判断线程是否存活

因为上面的情况,Thread对象和线程的生命周期不完全一样,所以不容易直接判断,就需要借助一些方法来获取当前线程的属性-是否存活

1)线程未结束

2)线程已结束

3.7是否被中断

这里只简单的查看一个线程是否被中断,至于如何中断一个线程,在后面介绍线程的核心操作部分介绍。

(1)查看一个死循环线程

(2)有限线程 

这种判断,即使一个线程自己结束了,也显示false


上面的重点是:五种线程的创建方式、给线程起名字、是否后台线程、是否存活这些等等;而线程的状态、是否被中断,在接下来的文章中重点介绍。


http://www.mrgr.cn/p/52216733

相关文章

学习笔记:NATS--自适应边缘和分布式系统的连接技术。(更新中)

基于NATS英文官方文档的学习,我将使用简单易懂的语言去解释NATS的各种机制及其原理。预计在一个月内,也就是在5月之前完成对NATS官方文档的笔记。大家可以将此笔记当做官方文档的中文低配版来学习。欢迎大家的阅读,也希望各位指出我笔记中可能存在的各种错误。目录1. NATS: …

【数据结构】顺序表的实现——静态分配

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:数据结构 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…

TOP100-回溯(二)

4.39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制…

AIR780E引脚复用笔记

1、应用场景:使用AIR780E模块驱动TM1637数码管驱动芯片,原有方案是AIR724UG+TM1637。为了降低成本,按照官方方案进行代码迁移。伴随着代码迁移,硬件引脚也需要做相应调整。由于其他引脚已经分配了对应的功能,仅剩余I2C引脚未使用,所以需要把I2C引脚【PIN66 PIN67】作为普…

Excel·VBA数组平均分组问题

看到一个帖子《excel吧-数据分组问题》,对一组数据分成4组,使每组的和值相近 上一篇文章《ExcelVBA数组分组问题》,解决了这个帖子问题的第1步,即获取所有数组分组形式的问题 接下来要获取分组和值最相近的一组,只需计…

Docker搭建私有仓库

因为dockerHub公共仓库是外网的,所以访问就特别慢,所以一般公司都会搭建私人的镜像仓库来保存镜像。一台服务上用docker开启一个私有仓库的镜像,后续其他的docket服务器都将镜像保存在这个私有的仓库 1 设置私有镜像仓库 # 下载镜像 docker…

【Linux】详解进程程序替换

一、替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执…

C++从入门到精通——命名空间

命名空间 前言一、命名空间引例什么是命名空间 二、命名空间定义正常的命名空间定义嵌套的命名空间多个相同名称的命名空间 三、命名空间使用加命名空间名称及作用域限定符使用using将命名空间中某个成员引入使用using namespace 命名空间名称引用引用命名空间和引用头文件有什…

腾讯云Ubuntu远程接入Vscode并设置root免密码登录

最近在尝试Linux编程,想起自己还有一个腾讯云的服务器,就重装了Ubuntu,然后装了环境之后尝试用Vscode连接,但是发现用root用户无论如何都登录不上,后来把用户名换成ubuntu之后就能登录上了,但是在VsCode上写代码时又出现了很多问题。 1、某些文件夹打不开,后来发现是用户…

LeetCode每日一题——移除链表元素

移除链表元素OJ链接:203. 移除链表元素 - 力扣(LeetCode) 题目: 思路: 这与之前的移除元素的题目很相似,那么我们同样可以用类似的做法(双指针)进行解题。但是这是一个链表删除&a…

element-ui checkbox 组件源码分享

简单分享 checkbox 组件,主要从以下三个方面来分享: 1、组件的页面结构 2、组件的属性 3、组件的方法 一、组件的页面结构 二、组件的属性 2.1 value / v-model 属性,绑定的值,类型 string / number / boolean,无…

java注解的实现原理

首先我们常用的注解是通过元注解去编写的, 比如: 元注解有Target 用来限定目标注解所能标注的java结构,比如标注方法,标注类; Retention则用来标注当前注解的生命周期;比如source,class&…

后处理 - 均值模糊

原理 就是取自身以及该像素周围的8个像素的颜色值相加,然后除9取个平均值,得到最终颜色值效果因为模糊后会出现一些方形的像素效果,模糊效果不是很平均,所以均值模糊也叫做盒状模糊。c#代码using UnityEngine;public class BoxBlurEff : MonoBehaviour {public Shader m_Sh…

星云小窝项目1.0——项目介绍(一)

星云小窝项目1.0——项目介绍(一) 文章目录 前言1. 介绍页面2. 首页2.1. 游客模式2.2. 注册用户后 3. 星云笔记3.1. 星云笔记首页3.2. 星云笔记 个人中心3.2. 星云笔记 系统管理3.3. 星云笔记 文章展示3.3. 星云笔记 新建文章 4. 数据中心5. 交流评论6. …

[OSS] 对象存储(OSS)概述

0 序本文属笔记型博文。目标读者:博主本人本文OSS的描述内容,主要参考阿里云的OSS产品。1 对象存储-概述 1.1 什么是对象存储OSS?对象存储服务(Object Storage Service)是阿里云等云平台提供的海量、安全、低成本、高可靠的云存储服务,提供与平台无关的RESTful API接口,…

[SpringMVC]知识点

本篇文章是关于SpringMVC各类知识点的小结,例如:restful风格、自定义异常处理器等。 如果文中阐述不全或不对的,多多交流。【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/18032069 出自【进步*于辰的博客】目录…

初始xpath

包的安装 pip install lxml谷歌浏览器插件安装 XPath Helper 可以自行搜索安装也可以点击: 传送门 解析流程与使用实例化一个etree的对象,把即将被解析的页面源码加载到该对象。 调用该对象的xpath方法结合着不同形式的xpath表达式进行标签定位和数据提取# 导入lxml.etree f…

HDFS的Shell操作及客户端配置方法

HDFS进程启停命令 Hadoop HDFS组件内置了HDFS集群的一键启停脚本。 $HADOOP_HOME/sbin/start-dfs.sh,一键启动HDFS集群$HADOOP_HOME/sbin/stop-dfs.sh,一键关闭HDFS集群 执行原理: 在执行此脚本的机器上,启动(关闭&…

处理登录失效后提示多个错误

问题: 我的场景是后端规定,即使登录失效返回的code仍是200,然后data的code是999什么的; 原本代码: 修改版代码: 通过节 const NotLoginEvent () > {router.replace("/login");localStorage.clear();M…

炒股技术整理系列:金针探底 雪迪龙 2024-02-06

特征: 1、大幅度下跌,大幅度是什么程度? 3个月最高点到最低点 跌了48%,,从确认趋势一个月内,跌了30%。 2、长下影线。涨幅不超过1%。 3、第二天或第三天收大幅阳线,已站上5日线 4、第四天可以买入。不跌破最后一根大阴线的中间段,可一直拿着。翻译 搜索 复制