JUC并发编程之常用方法

sleep()

public void testSleepAndYield() {Thread t1 = new Thread(() -> {try {log.debug("t1-sleep...");Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}}, "t1");log.debug("t1 start 前的状态:{}",t1.getState());   // NEW  创建t1.start();log.debug("t1 start 后的状态:{}",t1.getState());   // RUNNABLE 就绪 => t1 线程刚创建,还未 sleep// 让主线程等待一会儿,等 t1 线程 sleep 时,查看 t1 线程的状态try {Thread.sleep(500);} catch (InterruptedException e) {throw new RuntimeException(e);}log.debug("t1 sleep 时的状态:{}",t1.getState());   // TIMED_WAITING 阻塞
}   
16:34:01:196 [main] c.Test2 - t1 start 前的状态:NEW
16:34:01:198 [main] c.Test2 - t1 start 后的状态:RUNNABLE
16:34:01:199 [t1] c.Test2 - t1-sleep...
16:34:01:708 [main] c.Test2 - t1 sleep 时的状态:TIMED_WAITING
  1. 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞)
  2. 其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException
  3. 睡眠结束后的线程未必会立刻得到执行
  4. 建议用 TimeUnit 的 sleep 代替 Thread 的 sleep 来获得更好的可读性

join()

	static int i = 0;public static void main(String[] args) throws InterruptedException {test1();}private static void test1() throws InterruptedException {Thread t1 = new Thread(() -> {try {Thread.sleep(1000);i = 10;} catch (InterruptedException e) {throw new RuntimeException(e);}}, "t1");t1.start();// 让当前线程等待 t1 线程结束t1.join();log.debug("结果为:{}", i);}

未调用 join 方法

17:04:04:422 [main] c.TestJoin - 结果为:0

调用 join 方法

17:01:37:312 [main] c.TestJoin - 结果为:10

等待当前线程运行结束

join(long n):等待线程运行结束,最多等待 n 毫秒。

Interrupt()

打断 sleep,wait,join 的线程,这几个方法都会让线程进入阻塞状态

打断 sleep 的线程, 会清空打断状态

@Test
public void testInterrupt() throws InterruptedException {Thread t1 = new Thread(() -> {try {log.debug("sleeping");// 让 t1 线程进入休眠,外部线程尝试 interruptThread.sleep(5000);} catch (InterruptedException e) {throw new RuntimeException(e);}}, "t1");t1.start();Thread.sleep(1000);log.debug("interrupt");t1.interrupt();log.debug("是否被打断:{}",t1.isInterrupted());
}

可以看到t1 sleep 一秒后已经被打断了,且抛出了 InterruptedException: sleep interrupted异常,但是查询t1的打断状态缺失,显示未打断,说明 sleep 时线程被 interrupt 后,清除了 interrupt 的状态。

打断正常运行的线程,不会清除打断状态

private static void test1() {Thread t1 = new Thread(() -> {while (true){Thread current = Thread.currentThread();// 查看当前线程是否被打断boolean interrupted = current.isInterrupted();if (interrupted){log.debug("t1-interrupt...");break;}}}, "t1");t1.start();log.debug("interrupt");t1.interrupt();log.debug("是否被打断:{}",t1.isInterrupted());
}

注意 interrupt() 和 isInterrupted() 方法的区别

interrupted()isInterrupted()
static
判断当前线程是否被打断判断当前线程是否被打断
会清除 打断标记不会清除 打断标记

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

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

相关文章

机器学习 - 手动实现 ReLU 和 Sigmoid

直接上代码 import torch import matplotlib.pyplot as pltA torch.arange(-10, 10, 1, dtypetorch.float(32)) def relu(x):return torch.maximum(torch.tensor(0), x) plt.plot(relu(A))结果如下: import torch import matplotlib.pyplot as pltA torch.aran…

比 Python 快 9 万倍的 Mojo 终于开源了!

2024 年 3 月 29 日,Modular Inc. 宣布开源 Mojo 的核心组件。 Mojo 是一种专为编写人工智能软件设计的编程语言,去年 8 月份正式发布,迄今为止已经积累了超过 17.5 万名开发者和 5 万个组织。 人工智能模型通常使用多种编程语言编写。开发…

基于JSP的母婴用品网站

背景 随着时代的飞速进步,计算机技术已经广泛而深刻地渗透到社会的各个层面。人们生活质量的持续提升,以及对母婴产品需求的日益增长,都推动了母婴用品网站开发的必要性和紧迫性。这类网站依托计算机技术,通过对相关产品信息的有…

GRE_MGRE综合实验

目录 1、R5为ISP,只能进行IP地址配置,其所有地址均配为公有IP地址。 IP配置 配置公网全网通 2、(1)R1和R5间使用PPP的PAP认证,R5为主认证方。 PAP认证 (2)R2与R5之间使用ppp的CHAP认证&am…

html安装及入门

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、简单介绍一下前端三大件开发工具 二、安装VSCode三、VSCode相关配置1.汉化2.live server3.使用前 总结 提示:以下是本篇文章正文内容,下…

代码随想录算法训练营第三十八天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

代码随想录算法训练营第三十八天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯 509. 斐波那契数题目解法 70. 爬楼梯题目解法 746. 使用最小花费爬楼梯题目解法 感悟 509. 斐波那契数 题目 解法 使用动态规划 class Solution { public:int fib(int n) {if(n <…

文本文件操作

大家好&#xff1a; 衷心希望各位点赞。 您的问题请留在评论区&#xff0c;我会及时回答。 文件操作 程序运行时&#xff0c;产生的数据都是临时数据&#xff0c;程序一旦运行结束都会被释放。通过文件可以将数据持久化。 C中对文件进行操作需要包含头文件<fstream> 文件…

【scala】使用gradle和scala构建springboot程序

零、版本说明: springboot: 2.7.18 使用log4j2&#xff0c;不使用springboot自带的logback scala版本&#xff1a;2.11 jackson版本&#xff1a;2.16.0 一、依赖&#xff1a; buildscript {dependencies {// using spring-boot-maven-plugin as package toolclasspath("…

halcon例程学习——ball.hdev

dev_update_window (off) dev_close_window () dev_open_window (0, 0, 728, 512, black, WindowID) read_image (Bond, die/die_03) dev_display (Bond) set_display_font (WindowID, 14, mono, true, false) *自带的 提示继续 disp_continue_message (WindowID, black, true)…

【深耕 Python】Data Science with Python 数据科学(2)jupyter-lab和numpy数组

关于数据科学环境的建立&#xff0c;可以参考我的博客&#xff1a;【深耕 Python】Data Science with Python 数据科学&#xff08;1&#xff09;环境搭建 Jupyter代码片段1&#xff1a;简单数组的定义和排序 import numpy as np np.array([1, 2, 3]) a np.array([9, 6, 2, …

剑指Offer题目笔记22(快速排序)

快速排序定义&#xff1a; ​ 快速排序的基本思想是分治法&#xff0c;排序过程如下&#xff1a;在输入数组中随机选取一个元素作为中间值&#xff08;pivot&#xff09;&#xff0c;然后对数组进行分区&#xff08;partition&#xff09;&#xff0c;使所有比中间值小的数据移…

elasticsearch 8.12+kibana 8.12

准备工作&#xff1a;1.下载相关的安装包放到/usr/local/ES下面 elasticsearch下载地址:Download Elasticsearch | Elastic elasticsearch-head-master下载地址:https://github.com/mobz/elasticsearch-head/archive/master.zip node下载地址:Index of /dist/ kibana地址:Downl…