Java中的线程

news/2024/5/20 20:24:37

一、创建线程的几种方式?

① 通过继承Thread类并重写run方法

,实现简单但不可以继承其他类

Thread底层也是实现了Runnable接口,重写的是run而不是start方法

②实现Runnable接口并重写run方法,

避免了单继承的局限性,实现解耦,更灵活

可以通过匿名内部类,Runnable接口是一个函数式接口,可以用Lambda表达式

③实现Callable接口【泛型类型为重写call方法的返回值类型】并重写call方法

,可以获取线程的执行结果的返回值

FutureTask底层也是继承了Runnable接口,使用Thread结合FutureTask,这种方式可以拿到异步执行任务的结果。

④【项目中常使用的方式】通过线程池创建

ExecutorService es = new Executors.newSingleThreadExecutor();

然后es.submit(配合①或者②)

但是一般都是使用自定义创建线程池。

二、Runnable接口和Callable接口的区别:

Runnable接口run方法无返回值,Callable接口call方法有返回值,支持泛型。

Runnable接口run方法不允许抛出异常,只能在内部trycatch消化;而Callable的call方法允许抛出异常。

不能抛异常是因为:简化线程的异常处理 避免线程阻塞 提高代码的健壮性 保持接口的简洁性 提高线程池的稳定性和效率

三、在启动线程的时候,可以使用run方法吗,run和start有什么区别?

start方法:用来启动线程,通过该线程调用run方法执行run方法中定义的逻辑。start方法只能被调用一次。

run方法:封装了要被线程执行代码,可以被调用多次,如果直接调用run方法,则就是一个普通的方法【通过主线程调用的】,而想通过新线程去调用run方法则需要通过start去调用。

四、线程的几种状态,以及线程之间的切换?

Thread类中的枚举State

当线程对象被创建的时候为新建状态

当线程对象调用了start方法则进入就绪

当抢到CPU则直接进入运行,且就绪和运行都属于可运行状态

当线程对象无法获得锁,则进入阻塞状态,获得到了锁则切换为可运行状态

当线程对象调用了wait方法,则进入等待状态,通过notify方法唤醒,则切换为可运行状态

【可能存在锁竞争,如果是notifyAll方法,也可能存在锁竞争,因为可能有很多个线程同时被唤醒】

当线程对象调用sleep方法,进入计时等待状态,当休眠时间结束,则切换为可运行状态

当线程对象执行完,则进入死亡TERMINATED状态

五、notify和notifyAll区别

notify只随机唤醒一个wait线程【是否随机取决于虚拟机版本,HotSpot貌似是顺序执行】

notifyAll唤醒所有wait的线程

六、wait和sleep的区别

相同点: wait(long)、wait()、sleep(long)三者都是将当前线程暂时放弃cpu的使用权,进入等待状态

              wait(long)和sleep(long)都是在一定时间之后重新被唤醒【时间到了就从等待状态变为可运行状态,只要cpu分配到了就可以继续执行】,而wait()如果不主动唤醒则一直等待下去

不同点: wait方法为Object对象的,每个对象都有,而sleep为Thread类的静态方法

重点:

都能让当前线程暂时放弃cpu的使用权,进入阻塞状态

七、新建T1、T2、T3三个线程,如何保证它们按顺序执行?

使用线程中的join方法,join

调用join方法所在的线程将进入计时等待状态,直到调用join方法的线程执行完,

相当于让这两个线程之间有同步关系

八、怎么结束正在进行的线程?

第一种是已经不推荐使用的stop方法

第二种是通过interrupt方法中断线程【推荐的】

如果打断阻塞的线程(sleep,wait,join),则会抛出InterruptedException异常。

打断正常的线程,可以根据打断状态来标记是否退出线程

下面代码中通过if判断interrupted是否为true【默认为false】,为true则直接终止()循环,这样线程就终止了


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

相关文章

PVE安装Windows 95报错 while initializing device IOS

安装Win95重启后报错信息如下图,重启一直报错 while initializing device IOS,查了下报错原因说是 CPU频率太高导致,需要安装AMDK6UPD.EXE补丁包 下载地址 https://zhangka.lanzouw.com/igW0S1y8p5pe 打补丁操作流程: 1)将下载的iso文件加载到新光盘中 2)重启到dos环境…

迅饶科技 X2Modbus 网关 AddUser 任意用户添加漏洞复现

0x01 产品简介 X2Modbus是上海迅饶自动化科技有限公司Q开发的一款功能很强大的协议转换网关, 这里的X代表各家不同的通信协议, 2是T0的谐音表示转换, Modbus就是最终支持的标准协议是Modbus协议。用户可以根据现场设备的通信协议进行配置,转成标准的Modbus协议。在PC端仿真…

# IDEA 复制项目 Module 出现 不同模块下的 Product 类报错

IDEA 复制项目 Module 出现 不同模块下的 Product 类报错 我们 用 IDEA 复制项目 Module 出现 不同模块下的 Product 类报错,发现复制的 module 名称没有改变或者 java 文件夹后面还有原项目 source root 字样,maven 父子项目没有标识等问题。 解决方法…

【前端】实现表格简单操作

简言 表格合并基础篇 本篇是在上一章的基础上实现,实现了的功能有添加行、删除行、逆向选区、取消合并功能。 功能实现 添加行 添加行分为在上面添加和在下面追加行。 利用 insertAdjacentElement 方法实现,该方法可以实现从前插入元素和从后插入元…

12 华三的二层链路聚合

12 华三的二层链路聚合 配置思路 1. 配置二层静态聚合组 (1) 进入系统视图。 system-view (2) 创建二层聚合接口,并进入二层聚合接口视图。 interface bridge-aggregation interface-number [ lite ] 创建二层聚合接口后,系统将自动生成…

苍穹外卖Day06笔记

疯玩了一个月,效率好低,今天开始捡起来苍穹外卖~ 1. 为什么不需要单独引入HttpClient的dependency? 因为我们在sky-common的pom.xml中已经引入了aliyun-sdk-oss的依赖,而这个依赖低层就引入了httpclinet的依赖,根据依…

Linux 文件

文章目录 文件操作回顾(C/C)系统调用接口 管理文件认识一切皆文件C/C的文件操作函数与系统调用接口的关系……重定向与缓冲区 -- 认识重定向与缓冲区 -- 理解使用重定向缓冲区实现一个简单的Shell(加上重定向)标准输出和标准错误(在重定向下的意义) 磁盘文件磁盘存储文件操作系…

docker-compose安装es+kibana 8.12.2

小伙伴们,你们好,我是老寇,我又回来辣,几个月不见甚是想念啊!!! 因云平台需要改造,es7升级为es8,所以记录一下,es8需要开启ssl认证,需要配置证书…

第147天:免杀对抗-C2远控篇CC++ShellCode定性分析生成提取Loader加载模式编译执行

https://blog.csdn.net/qq_29948489/article/details/136180966 #C2远控-ShellCode-认知&环境 1.创建工程时关闭SDL检查 2.属性->C/C++->代码生成->运行库->多线程 (/MT)如果是debug则设置成MTD 3.属性->C/C++->代码生成->禁用安全检查GS 4.关闭生成清…

再探URLDNS链(手搓exp)

夜深了,想着还需要沉淀自己的基础能力,于是乎没有继续往CC链里爬,通过研究了一下ysoserial里的URLDNS链,决定自己尝试写一个类似却有些不同的exp,使自己的基础更加牢固一些,故有了今天这篇文章。 ysoserial里的URLDNS链我就不再多说,有兴趣的话自己可以去看下面这篇文章…

zabbix动作执行命令失效不起作用?

1. zabbix在web界面设置完主机组,主机,监控项,触发器,动作之后 监控项监控到了,触发器触发动作,但是执行的指令不起作用 流程 在zabbix-agent端将nginx服务down掉,zabbix会自动监控并执行重启的…

长安车机安装三方APP

前言 长安车机目前为基于安卓自研的系统。 目前 默认这个车机系统,不允许安装三方软件,具体表现为:插入u盘识别不出里边的apk文件。 自带的软件版本都特别低,且不支持升级,只能等待整个车机系统连带升级。 重点是,他们通常好几年不推送升级车机系统! 重点来了:没有攻破…

AcWing 4993 FEB

4993. FEB - AcWing题库 大佬亲笔 将原串分成三段&#xff1a; FFF|E.....B|FFF 先合并中间段&#xff0c;再合并两边的段 #include <iostream> #include <cstring> #include <algorithm> #include <string> #include <queue&g…

Golang——IO操作

1. 输入输出的底层原理 终端其实是一个文件(Linux下一切皆文件)&#xff0c;相关实例如下&#xff1a; os.Stdin&#xff1a;标准输出的文件实例&#xff0c;类型为*Fileos.Stdout&#xff1a;标准输入的文件实例&#xff0c;类型为*Fileos.Stderr&#xff1a;标准错误输出的文…

项目冲刺day2

这个作业属于哪个课程 软工4班这个作业要求在哪里 作业要求1.会议1. 照片2. 昨日已完成: 部分完成登录、注册功能。3.今天计划完成的工作 完成登录、注册功能,部分完成用户中心功能4.工作中遇到的困难 对框架不熟悉,出现很多报错。2.燃尽图3.每人的代码签入记录4.适当的项目…

斯坦福大学的在线密码学课程

密码学是保护计算机系统信息不可或缺的工具。在本课程中&#xff0c;您将了解密码系统的内部工作原理&#xff0c;以及如何在实际应用中正确使用它们。课程首先将详细讨论当强大的对手窃听和篡改流量时&#xff0c;拥有共享密钥的双方如何进行安全通信。我们将研究许多已部署的…

musl-libc 安装与调试

musl-libc 官网:http://musl.libc.org1、下载与安装下载源码并解压编译参数./configure [option]... [VAR=VALUE]... option 说明 --help帮助 --prefix=DIR指定安装目录。默认为/usr/local/musl --host=HOST设置目标程序运行的CPU平台 一般不需要设置,除非你想要交叉编译 默…

....comic科学....食用手册....

1.点击链接后&#xff0c;保存漫画至夸克网盘&#xff0c;若是新用户需要用手机注册. 2.在应用商店下载夸克APP. 3.登录APP下载已保存的漫画. 3.1 进入APP点击 夸克网盘 3.2 点击“转存的内容”后&#xff0c;长按 漫画文件夹&#xff0c;点击下载&#xff0c;下载速度400K左…

C++向函数传递对象

C语言中&#xff0c;对象作为函数的参数和返回值的传递方式有 3 种&#xff1a;值传递、指针传递和引用传递。 1. 对象作为函数参数 把实参对象的值复制给形参对象&#xff0c;这种传递是单向的&#xff0c;只从实参到形参。因此&#xff0c;函数对形参值做的改变不会影响到实…

El-table组件实现懒加载

背景 有的时候我们表格的数据不想使用分页组件展示,想要显示所有的数据,但是显示所有数据会导致服务器负荷严重(比如CPU过载),我们可以使用懒加载的形式,此方式利用监听是否滚动到元素底部,如果到元素底部就去请求下一页的数据 原理效果图示例代码 <template><di…