多线程 02

 1.线程的常见构造方法

方法说明
Thread()创建线程对象
Thread(Runnable target)使用 Runnable 对象创建线程对象
Thread(String name)创建线程对象,并命名
Thread(Runnable target, String name)使用 Runnable 对象创建线程对象,并命名
【了解】Thread(ThreadGroup group,
Runnable target)
线程可以被用来分组管理,分好的组即为线程组,这
个目前我们了解即可

2.线程的几个属性和方法

属性获取方法
IDgetId()
名称getName()
状态getState()
优先级getPriority()
是否后台线程isDaemon()
是否存活isAlive()
是否被中断isInterrupted()

这里的后台线程和前台线程不同,当所有的前台线程执行完毕,即使后台线程还在工作中,也会直接自动退出.

只要前台线程没执行完,进程就不会结束,即使main结束了,前台线程也会继续执行

设置为后台进程

setDaemon()设为true就是后台,不设置就是默认前台

isAlive()表示内核中的PCB是否存在

这个对象的生命周期和PCB的是不完全一样的

因为我在创建对象之后这个PCB才存在,在执行完进程结束后之后这个PCB才销毁,而且java中的用户级线程不是直接映射到操作系统中的原生线程的

3.创建线程的5个方式

其实线程是操作系统提供的一种机制,并给用户提供了一些api供使用,Java的Thread类只是对其的进一步封装.

1.继承Thread类,重写run方法

2.重写runnable接口

3.使用匿名内部类实现Thread

4.使用匿名内部类实现Runnable接口

5.使用Lambda表达式

4.start()和run()方法的区别

说实话这两个方法是八竿子打不着的,为什么要把他们两个放进来比较呢?

可能有人认为start方法和run方法执行的是一件事情

其实这个理解是大错特错的,这两个方法完全不一样,我们举个例子

假设我们在调用main方法中调用一个run方法,你可能以为这样和使用start方法是一样的,其实不然,我们在run方法之前加上一个死循环,让run方法一直无法执行.而start方法却可以执行,因为start方法是重新创建了一个新的线程,不是在main线程中国运行的,所以不会受main线程中的死循环的干扰..

5.终止一个线程

package Thread;public class ThreadDemo12 {private static boolean isQuit = false;public static void main(String[] args) throws InterruptedException {Thread t = new Thread(()->{while(!isQuit){System.out.println("我是一个线程,工作中");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println("线程工作完毕");});t.start();Thread.sleep(3000);isQuit = true;System.out.println("让t线程退出");}
}

最后结果为

这就好比这个时候我在打游戏,女朋友突然叫我去和她一起开心一下,这个时候就是main线程来中断我这个t线程,我得配合她她才能中断我的动作,假设我不配合,那她也没有办法.

所以这里的线程运行中想要中断,其实是需要两个线程中相互配合的,这里就使用了isQuit变量来实现其中的相互配合.

.

其实这里也有一个方法来实现对线程的中断,我们来尝试一下

interrupt()

isInterrupted() 判断是否被打断

我们不妨来试试用这个来作为标志位

package Thread;public class ThreadDemo13 {public static void main(String[] args) {Thread t = new Thread(()->{while(!Thread.currentThread().isInterrupted()) {System.out.println("我是一个线程,正在工作");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("线程执行完毕");});t.start();try {Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("t线程退出");t.interrupt();}
}

结果是

我们发现t线程并没有真正的执行结束,并且捕获了一个打断异常

结论:

sleep中的线程被打断之后,线程并没有直接退出,而是继续一直输出信息

这是因为线程在睡眠中被打断会抛出一个异常,并将isInterrupted重新设置为false

解决方案,在收到这个打断的异常之后,直接break跳出循环

有人会觉得还不如之前的isQuit标志位好,想在遇到这个异常信息的时候将isQuit设置为true,其实是行不通的,可以参考我上一篇文章中的变量捕获.因为匿名内部类中调用的局部变量只能是final修饰的或是事实final的

6.线程中的join方法

join方法能够实现线程的等待,假如在main线程中调用t.join,此时main线程就会等待t线程执行结束后再继续工作,t线程执行的时候,此线程属于阻塞状态

下面举个例子说明一下

package Thread;public class ThreadDemo14 {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(()->{for (int i = 0; i < 5; i++) {System.out.println("马上到...");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println("终于到了!!!");});t1.start();t1.join();System.out.println("我等你好久了~~~");}}

执行结果如下

注:start方法一定在join方法之前调用

此时main线程等待了t1线程执行完了才开始执行

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

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

相关文章

JS文字操作库(亲测可用)

使用 <template><div class"app"><li class"main_right-btn" click"selectionColor(yellow)">题干标识</li><li class"main_right-btn" click"selectionColor(transparent)">取消标识</li…

K-means算法

K-means算法 Lloyd k-means Algorithm 样本矩阵&#xff1a; X [ x 1 , x 2 , . . . , x n ] ∈ R d n X[x_1,x_2,...,x_n] ∈R^{dn} X[x1​,x2​,...,xn​]∈Rdn&#xff0c;有n个 x i x_i xi​每个 x i x_i xi​是d维 簇集合&#xff1a; C [ C 1 , C 2 , . . . , C c …

自由飞翔之小鸟

一、创建文件、包、类、插入图片文件 二、app包 1、Gameapp类&#xff08;运行游戏&#xff09; package app;import main.GameFrame;public class Gameapp {public static void main(String[] args) {//游戏的入口new GameFrame();} } 三、main包 1、Barrier&#xff08;障…

【实验】配置用户自动获取IPv6地址的案例

【赠送】IT技术视频教程&#xff0c;白拿不谢&#xff01;思科、华为、红帽、数据库、云计算等等​编辑https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502【…

Pyqt5 设置保存上一次结果(配置文件)

效果 每次打开Pyqt5打包后的程序&#xff0c;默认显示的是上一次的结果 例如下图的 文件路径、表名、类型等 大致的思路 Pyqt5自带的方法QSettings实现保存上一次的设置&#xff0c;其思路是读取ini文件&#xff0c;如果不存在就是程序的初始状态&#xff0c;如果存在则可以读取…

C++程序中dump文件生成方法详解

最近项目中新作成了一个动态链接库&#xff0c;长时间运行后&#xff0c;偶尔会崩溃。根据log分析&#xff0c;被调用的动态库函数最外层catch到了这个异常&#xff0c;但是不能定位哪里出了问题。另外虽然上层exe是有dump文件输出处理的&#xff0c;但是在C中&#xff0c;如果…

如何利用Python进行数据归一化?

1. 知识简介 数据归一化是数据预处理的一项重要步骤&#xff0c;它对于提高模型性能、加速模型训练、避免数值计算问题以及提高模型的泛化能力都具有重要作用。进行数据归一化可以起到以下作用&#xff1a;消除量纲影响&#xff0c;加速模型收敛&#xff0c;提高模型性能&…

硅谷大宽服务器:引领互联网新时代的核心技术

在当今这个信息爆炸的时代&#xff0c;数据已经成为了企业和个人的重要资产。服务器作为数据的存储和处理中心&#xff0c;其重要性不言而喻。硅谷大宽服务器以其卓越的性能、稳定的运行和优质的服务&#xff0c;赢得了全球众多企业和个人的信赖和选择。 硅谷大宽服务器的特点…

图解分库分表

中大型项目中&#xff0c;一旦遇到数据量比较大&#xff0c;小伙伴应该都知道就应该对数据进行拆分了。有垂直和水平两种。 垂直拆分比较简单&#xff0c;也就是本来一个数据库&#xff0c;数据量大之后&#xff0c;从业务角度进行拆分多个库。如下图&#xff0c;独立的拆分出…

Redisson分布式锁实现原理

Redisson主要解决一下问题 重入问题&#xff1a;重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中&#xff0c;可重入锁的意义在于防止死锁&#xff0c;比如HashTable这样的代码中&#xff0c;他的方法都是使用synchronized修饰的&#xff0c;假如他在一个方法内&a…

解决Spring Boot应用在Kubernetes上健康检查接口返回OUT_OF_SERVICE的问题

现象 在将Spring Boot应用部署到Kubernetes上时&#xff0c;健康检查接口/healthcheck返回的状态为{"status":"OUT_OF_SERVICE","groups":["liveness","readiness"]}&#xff0c;而期望的是返回正常的健康状态。值得注意的…

VTK物体表面画贴合线条

1、自由画线 2、曲线拟合画线 3、三点闭合曲线

Docker Compose部署微服务项目实战讲解

一、Docker Compose简介 当需要在多个容器之间协调和管理应用程序时&#xff0c;Docker Compose是一个非常有用的工具。它允许通过一个配置文件来定义、配置和启动多个 Docker 容器&#xff0c;使得整个应用程序的部署变得更加简单和一致。以下是 Docker Compose 的一些重要概…

Linux使用宝塔面板+Discuz+cpolar内网穿透工具搭建可公网访问论坛

Linux宝塔面板搭建Discuz论坛&#xff0c; 并内网穿透实现公网访问 文章目录 Linux宝塔面板搭建Discuz论坛&#xff0c; 并内网穿透实现公网访问前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 前言 Crossday Di…

【 图片加载】Vue前端各种图片引用

文章目录 一、图片作为js常量&#xff08;常作为配置项的值 &#xff09;1、在线链接2、本地图片 二、图片img标签1、一般的src2、动态的src用require3、src可以接收二进制文件blob&#xff08;如后端返回的、a-upload传的图片) 三、背景图片 一、图片作为js常量&#xff08;常…

8款那些年救过我的数据文件恢复软件 - 误删除重要文件的“后悔药”

无论您在保存备份方面多么小心&#xff0c;灾难有时还是会发生。有时您的备份软件无法按预期运行。 如果您的外部驱动器靠近您的设备&#xff0c;发生火灾/洪水/故障时&#xff0c;有时备份会与原始文件一起丢失。即使是云存储也不能避免故障。 还有一个事实是&#xff0c;我…

C++设计模式之工厂模式(上)——简单工厂模式

工厂模式 概述简单工厂模式介绍示例示例使用运行结果缺点 概述 工厂模式属于一种创建型设计模式。其可以分为简单工厂模式&#xff0c;工厂模式和抽象工厂模式。工厂模式分为上、中、下三篇&#xff0c;本篇主要介绍简单工厂模式。 简单工厂模式 介绍 简单工厂模式可以理解…

二叉树题目:具有所有最深结点的最小子树

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;具有所有最深结点的最小子树 出处&#xff1a;865. 具有所有最深结点的最小子树 难度 5 级 题目描述 要求 给定…

HCIP-六、OSPF-2 综合实验

六、OSPF-2 综合实验 实验拓扑实验需求及解法1.设备名称和部分IP地址已配置2.所有设备运行OSPF&#xff0c;进程号为13.区域间路由汇总4.外部路由汇总5.下发默认路由6. 虚链路 实验拓扑 实验需求及解法 本实验模拟OSPF综合型网络&#xff0c;按照以下需求完成实验。 1.设备名…