【Thread 线程】线程的方法与状态

SueWakeup

                                                      个人中心:SueWakeup

                                                      系列专栏:学习Java

                                                      个性签名:保留赤子之心也许是种幸运吧  

 

 

本文封面由 凯楠📷 友情赞助播出!

 目录

一个线程的生命周期

线程终止的原因

线程的方法

 Thread 类的静态方法

1. 设置线程的优先级与休眠

2. 中断线程

3. 让出线程

4. 守护线程

5. 线程插队

注:手机端浏览本文章可能会出现 “目录”无法有效展示的情况,请谅解,点击侧栏目录进行跳转  


一个线程的生命周期

线程是一个动态执行的过程,它也有一个从产生到死亡的过程。

  • 新建状态(New):使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程
  • 运行状态(Runnable):运行中的线程,已经调用 start() 方法,线程正在或即将执行 run() 方法
  • 终止状态(Terminated):线程已终止,因为 run() 方法执行完毕
  • 阻塞状态(Blocked):运行中的线程,在等待竞争锁时,被阻塞,暂不执行
  • 等待状态(Waiting):运行中的线程因为 sleep() 或 join() 等方法调用,进入等待
  • 计时等待状态(Timed Waiting):运行中的线程,因为执行 sleep(X ms) 或 join(X ms)等方法,进入计时等待

线程终止的原因

  • 正常终止:run() 方法执行到 return 语句返回
  • 意外终止:run() 方法因为未捕获的异常导致线程终止
  • 对某个线程的 Thread 实例调用 stop() 方法强制终止(不推荐)

线程的方法

序号方法描述
1

public void start()

JVM 调用该线程的 run() 方法

2

public void run()

如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run方法

否则,该方法不执行任何操作并返回

3

public final void setName(String name)

改变线程名称

4

public final void setPriority(int priority)

更改线程的优先级

5

public final void setDaemon(boolean on)

将该线程标记为守护线程或用户线程

6

public final void join(long millisec)

等待该线程终止的时间最长为 millis 毫秒

7

public void interrupt()

中断线程

8

public final boolean isAlive()

测试线程是否处于活动状态

 Thread 类的静态方法

序号方法描述
1

public static void yield()

暂停当前正在执行的线程对象,并执行其他线程。

2

public static void sleep(long millisec)

在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),受系统计时器和调度程序精度和准确性的影响。

3

public static boolean holdsLock(Object x)

当且仅当当前线程在指定的对象上保持监视器锁时,才返回 true。

4

public static Thread currentThread()

返回对当前正在执行的线程对象的引用。

5

public static void dumpStack()

将当前线程的堆栈跟踪打印至标准错误流。

1. 设置线程的优先级与休眠

class MyTask implements Runnable{@Overridepublic void run() {char c ='6';for(int i=1;i<=26;i++,c++){//线程的休眠
//            try {
//                Thread.sleep(1000);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }System.out.println(Thread.currentThread().getName()+":"+c);}}
}
         /*线程的设置*/MyTask task = new MyTask();Thread t1 = new Thread(task, "线程1");Thread t2 = new Thread(task);t2.setName("线程2");//设置线程的优先级(起参考作用)t1.setPriority(1);t2.setPriority(10);t1.start();t2.start();

解读:

  • 通过 Thread 对象 t1 / t2 的 setPriority() 方法设置线程优先级,1为最低优先级,10为最高优先级
  • 注释部分为线程的休眠部分 Thread.sleep(1000):休眠1秒

2. 中断线程

        //线程中断Thread t = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("子线程开始执行");//Thread.sleep();方法可以自动监听中断状态
//                try {
//                    Thread.sleep(6000);//子线程休眠6000豪秒
//                } catch (InterruptedException e) {
//                    System.out.println("子线程中断");
//                }//检查当前线程是否处于中断while (!Thread.currentThread().isInterrupted()){System.out.println("塔塔开...");}System.out.println("子线程结束执行");}});t.start();try {Thread.sleep(3000);//主线程休眠3000毫秒} catch (InterruptedException e) {e.printStackTrace();}//设置子线程t的中断状态t.interrupt();System.out.println("main主线程结束执行......");

解读:

  • 通过 Thread.currentThread().isInterrupted() 方法检查当前线程是否处于中断状态
  • 如果取消注释掉的部分,子线程会在休眠期间被中断

3. 让出线程

        //线程的让出Thread t1 =new Thread(new Runnable() {@Overridepublic void run() {char c='a';for(int i=1;i<27;i++,c++){System.out.println(Thread.currentThread().getName()+":"+c);}}},"子线程1");Thread t2 =new Thread(new Runnable() {@Overridepublic void run() {for(char i ='a';i<'z';i++){//让出线程cpu处理器的执行Thread.yield();System.out.println(Thread.currentThread().getName()+":"+i);}}},"子线程2");t1.start();t2.start();

解读:

  • 在 t1 线程的 run() 方法中每次循环打印一个字母,t2 线程会在每次循环中,调用 Thread.yield() 方法来让出线程的 CPU 执行权
  • 线程 t1 和 t2 会交替执行,但是因为 t2 使用了 Thread.yield() 方法,增加了线程切换的可能性,影响线程的效率

4. 守护线程

        //守护线程Thread t1 =new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(6000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("子线程结束执行!");}},"子线程1");//设置为守护线程t1.setDaemon(true);t1.start();//main主线程在子线程休眠结束前恢复try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Game Over~~");

解读:

  • 通过调用 t1.setDaemon(true) 将线程 t1 设置为守护线程,当所有非守护线程结束时,守护线程会随之结束

5. 线程插队

class MyTask1 implements Runnable{@Overridepublic void run() {char c ='一';for(int i=1;i<27;i++,c++){System.out.println(Thread.currentThread().getName()+":"+c);}}
}
        //子线程的插队MyTask1 task = new MyTask1();Thread t1 = new Thread(task,"子线程1");t1.start();try {t1.join(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("主线程执行结束,完成执行");

解读:

  • 调用 t1.join(1000) 方法,让主线程等待 t1 线程执行完毕或等待一定的时间,在等待 t1 线程执行完毕或超时后,主线程才开始执行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/756783.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

59、服务攻防——中间件安全CVE复现IISApacheTomcatNginx

文章目录 中间件——IIS漏洞中间件——Nginx漏洞中间件——Apache中间件——Tomcat 中间件&#xff1a;IIS、Apache、Nginx、Tomcat、Docker、Weblogic、JBoss、WebSphere、Jenkinsphp框架&#xff1a;Laravel、Thinkphppythonl框架&#xff1a;Flaskjs框架&#xff1a;jQueryj…

【Unity】从0到1的横版2d制作笔记-DAY1

写在前面&#xff1a; 感谢旻子提供的Unity2d课程捏&#xff0c;红豆泥阿里嘎多 创建项目 测试Visual Studio的使用 右键选择【create】&#xff0c;右键创建C# Script&#xff0c;待文件创建完毕后双击查看能否正确跳转。 正确跳转的结果是能看见代码中注释标注有&#xff1a;…

mysql - 查询成本 - 优化器

查询成本 我们之前老说MySQL执行一个查询可以有不同的执行方案&#xff0c;它会选择其中成本最低&#xff0c;或者说代价最低的那种方案去真正的执行查询。不过我们之前对成本的描述是非常模糊的&#xff0c;其实在MySQL中一条查询语句的执行成本是由下边这两个方面组成的&…

分布式搜索引擎elasticsearch专栏二

上一篇的传送门&#xff1a; 分布式搜索引擎elasticsearch专栏一-CSDN博客 这一篇博文主要讲解elasticsearch的数据搜索功能。下面会分别使用DSL和RestClient实现搜索。 1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsea…

[PwnThyBytes 2019]Baby_SQL

[PwnThyBytes 2019]Baby_SQL 查看源码发现 下载源码&#xff0c;首先观察index.php 首先进入index.php&#xff0c;会执行session_start();启动session这里通过foreach将所有的环境变量的值都遍历了一遍&#xff0c;并且都使用了addslashes()进行转义&#xff0c;然后就定义了…

GO语言:函数、方法、面向对象

本文分享函数的定义、特性、defer陷阱、异常处理、单元测试、基准测试等以及方法和接口相关内容 1 函数 函数的定义 func 函数名(参数列表) (返回值列表) { // 函数体&#xff08;实现函数功能的代码&#xff09; } 匿名函数的定义就是没有函数名&#xff0c;可以当做一个函…

使用华为云HECS服务器+nodejs开启web服务

简介: 在华为云HECS服务器上使用nodejs开启一个web服务。 目录 1.开通华为云服务器 2.远程登录 2.1 使用华为官方的网页工具登录 ​编辑 2.2 使用MobaXterm登录 3 安装node 3.1 下载 2. 配置环境变量 4. 安装express模块 5.开启外网访问 1.开通华为云服务器 这…

MySQL与金蝶云星空对接集成SELECT语句连通销售订单新增(销售订单集成测试)

MySQL与金蝶云星空对接集成SELECT语句连通销售订单新增(销售订单集成测试) ​​ ​​ 数据源系统:MySQL MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQLAB公司开发&#xff0c;属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一&#xff0c;在WEB应用方…

ASPICE规范之系统追溯矩阵

系统追溯矩阵的需求来自 ISO26262 举例在描述系统追溯矩阵时&#xff1a;客户需求->系统需求&#xff1b;系统需求->客户需求&#xff1b;系统需求->软件需求&#xff1b;系统需求->硬件需求

【LabVIEW FPGA入门】使用FPGA实现串行同步接口(SSI)

SSI&#xff08;串行同步接口&#xff09;是连接绝对位置传感器和控制器的广泛应用的串行接口。SSI利用控制器发出一个时钟脉冲序列&#xff0c;初始化传感器的门限输出。 传感器不断更新位置数据&#xff0c;并传送到移位寄存器中。在每一个时钟脉冲序列之间&#xff…

在Ubuntu20.04(原为cuda12.0, gcc9.几版本和g++9.几版本)下先安装cuda9.0后再配置gcc-5环境

因为自己对Linux相关操作不是很熟悉&#xff0c;所以因为之前的代码报错之后决定要安cuda9.0&#xff0c;于是先安装了cuda9.0。里面用到的一些链接&#xff0c;链接文件夹时直接去copy它的路径&#xff0c;就不那么容易错了。 今天运行程序之后发现gcc环境不太匹配cuda9.0&am…

FX-数组的使用

1一维数组 1.1一维数组的创建和初始化 1.1.1数组的创建 //代码1 int arr1[10]; char arr2[10]; float arr3[1]; double arr4[20]; //代码2 //用宏定义的方式 #define X 3 int arr5[X]; //代码3 //错误使用 int count 10; int arr6[count];//数组时候可以正常创建&#xff1…

【十三】【算法分析与设计】二分查找(1)

704. 二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9 输出: 4…

win10笔记本在显示设置中不慎将主显示器禁用掉导致开机黑屏的解决方案

因为笔记本电脑的显示扩展接口有问题&#xff0c;所以在电脑开机之后&#xff0c;会误识别出几个不存在的扩展屏幕&#xff0c;所以我就想从显示设置中将这几个误识别出来的扩展屏幕禁用掉&#xff08;不然鼠标总是移动到主屏幕边界之外的地方&#xff09;&#xff0c;在显示设…

2024年腾讯云GPU服务器价格表_1小时费用_一个月价格和一年优惠

腾讯云GPU服务器怎么收费&#xff1f;GPU服务器1小时多少钱&#xff1f;一个月收费价格表和一年费用标准&#xff0c;腾讯云百科txybk.com分享腾讯云GPU服务器GPU计算型GN10Xp、GPU服务器GN7、GPU渲染型 GN7vw等GPU实例费用价格&#xff0c;以及NVIDIA Tesla T4 GPU卡和V100详细…

【SZU计算机网络实验】实现流式视频传输

前言 一百年没有更新博客了&#xff0c;都怪开学一堆杂活&#xff08;x 那就顺手把实验报告转到这边吧owo 本实验为SZU原创实验&#xff0c;实验开发团队的老师和助教们都很有耐心。。大赞&#xff0c;环境没配好去群里问是秒回的 相关资料&#xff1a; 实验文档&#xff…

k8s详细教程

Kubernetes详细教程 1. Kubernetes介绍 1.1 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点…

JavaScript高级(十八)---进程和线程,宏任务和微任务

进程和线程 进程&#xff08;process&#xff09;&#xff1a;计算机已经运行的程序&#xff0c;是操作系统管理程序的一种方式&#xff0c;我们可以认为&#xff0c;启动一个应用程序&#xff0c;就会默认启动一个进程&#xff08;也可能是多个进程&#xff09;。 线程&…

行业模板|DataEase制造行业大屏模板推荐

DataEase开源数据可视化分析平台于2022年6月发布模板市场&#xff08;https://templates-de.fit2cloud.com&#xff09;&#xff0c;并于2024年1月新增适用于DataEase v2版本的模板分类。模板市场旨在为DataEase用户提供专业、美观、拿来即用的大屏模板&#xff0c;方便用户根据…

智能合约 之 ERC-721

ERC-721&#xff08;Non-Fungible Token&#xff0c;NFT&#xff09;标准 ERC-721是以太坊区块链上的一种代币标准&#xff0c;它定义了一种非同质化代币&#xff08;Non-Fungible Token&#xff0c;NFT&#xff09;的标准。NFT是一种加密数字资产&#xff0c;每个代币都具有独…