当前位置: 首页 > news >正文

JavaWeb13-线程休眠和指定唤醒:LockSupport

目录

1.LockSupport.park():休眠当前线程

2.LockSupport.unpark(线程对象):唤醒某一个指定的线程

3.扩展:LockSupport.parkUntil(long)等待最大时间是一个固定时间

4.LockSupport和Interrupt

5.LockSupport VS wait

相同点:

①二者都能使线程进入休眠状态。

②二者在不传递参数的情况下,都会让线程进入WAITING无限期等待状态。

不同点:

①LockSupport使用时不需要加锁,不需要配合synchronized一起使用;而wait需要配合synchronized一起使用。

②LockSupport不会抛出Interrupt的异常,而wait会。

③LockSupport可以指定某一个线程进行唤醒,而wait和notify不行。

PS:线程休眠4种方式:


有wait和notify是因为sleep只能到点之后再被唤醒,不能主动唤醒。

上述方法的问题:在调用notify时会随机唤醒,无法唤醒指定的某一个线程,不能把握线程唤醒的顺序。

使⽤ LockSupport 也可以使线程休眠和唤醒,它包含两个主要的⽅法↓

注:LockSupport 无需配合 synchronized 使用。

1.LockSupport.park():休眠当前线程

import java.util.concurrent.locks.LockSupport;public class LockSupportDemo1 {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {System.out.println("线程1:开始执行");LockSupport.park();System.out.println("线程1:结束执行");},"线程1");t1.start();}
}

2.LockSupport.unpark(线程对象):唤醒某一个指定的线程

import java.util.concurrent.locks.LockSupport;public class LockSupportDemo1 {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {System.out.println("线程1:开始执行");LockSupport.park();System.out.println("线程1:结束执行");},"线程1");Thread t2 = new Thread(() -> {System.out.println("线程2:开始执行");LockSupport.park();System.out.println("线程2:结束执行");},"线程2");Thread t3 = new Thread(() -> {System.out.println("线程3:开始执行");LockSupport.park();System.out.println("线程3:结束执行");},"线程3");t1.start();t2.start();t3.start();Thread.sleep(1000);System.out.println();LockSupport.unpark(t1); //唤醒线程1开始执行Thread.sleep(1000);LockSupport.unpark(t2); //唤醒线程2开始执行Thread.sleep(1000);LockSupport.unpark(t3); //唤醒线程3开始执行}
}

3.扩展:LockSupport.parkUntil(long)等待最大时间是一个固定时间

import java.time.LocalDateTime;
import java.util.concurrent.locks.LockSupport;public class LockSupportDemo2 {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {System.out.println("线程1:开始执行 |" + LocalDateTime.now());//当前时间 + 超时时间(唤醒时间)LockSupport.parkUntil(System.currentTimeMillis() + 3000);//3000ms代表3s,表示3s之后恢复执行System.out.println("线程1:结束执行 |" + LocalDateTime.now());},"线程1");t1.start();}
}

4.LockSupport和Interrupt

之前的 sleep/TimeUnit/wait 写法都需要加try-catch包裹来接收Interrupt异常,写法不够优雅;而 LockSupport.park/parkUntil在休眠时不需要try-catch包裹,不需要接收 Interrupt 异常。

try {Thread.sleep(1000);
} catch (InterruptedException e) {e.printStackTrace();
}try {TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {e.printStackTrace();
}synchronized (lock){try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}
}LockSupport.park();
LockSupport.parkUntil(1000 + System.currentTimeMillis());

LockSupport 不会抛出 Interrupt 的异常,但可以监听到 Interrupt 的通知:

import java.util.concurrent.locks.LockSupport;public class ThreadDemo20 {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {Thread currThread = Thread.currentThread();System.out.println("线程中止状态:" + currThread.isInterrupted());LockSupport.park();System.out.println("线程中止状态:" + currThread.isInterrupted());});t1.start();Thread.sleep(1000);System.out.println("中止线程");t1.interrupt();LockSupport.unpark(t1);}
}

5.LockSupport VS wait

相同点:

①二者都能使线程进入休眠状态。

②二者在不传递参数的情况下,都会让线程进入WAITING无限期等待状态。

不同点:

①LockSupport使用时不需要加锁,不需要配合synchronized一起使用;而wait需要配合synchronized一起使用。

②LockSupport不会抛出Interrupt的异常,而wait会。

③LockSupport可以指定某一个线程进行唤醒,而wait和notify不行。

PS:线程休眠4种方式:

  1. sleep(传参设置休眠时间;不可唤醒)
  2. TimeUnit(传参设置休眠时间;不可唤醒)
  3. wait/notify/notifyAll(可传参设置休眠时间,也可不传参无限等待;可以唤醒)
  4. LockSupport.park()/parkUntil(long)/unpark(thread)(parkUntil可传参设置休眠时间,park也可不传参无限等待;unpark传参唤醒指定线程)

相关文章:

JavaWeb13-线程休眠和指定唤醒:LockSupport

目录 1.LockSupport.park():休眠当前线程 2.LockSupport.unpark(线程对象):唤醒某一个指定的线程 3.扩展:LockSupport.parkUntil(long)等待最大时间是一个固定时间 4.LockSupport和Interrupt 5.LockSupport VS wait 相同点:…...

【第一章:Spring概述、特点、IOC容器、IOC操作bean管理(基于xml方式创建对象,注入属性)】

第一章:Spring概述、特点、IOC容器、IOC操作bean管理(基于xml方式创建对象,注入属性) 1.Spring是什么? ①Spring是一款主流的java EE 轻量级开源框架。 ②广义的Spring:Spring技术栈,Spring不再…...

前端react面试题(边面边更)

展示组件(Presentational component)和容器组件(Container component)之间有何不同 展示组件关心组件看起来是什么。展示专门通过 props 接受数据和回调,并且几乎不会有自身的状态,但当展示组件拥有自身的状态时,通常也只关心 UI 状态而不是…...

产品3C认证在哪里办理

​一、什么是CCC认证 3C认证的全称为“中国强制性产品认证”,英文名称China Compulsory Certification,英文缩写CCC。它是中国政府为保护消费者人身安全和国家安全、加强产品质量管理、依照法律法规实施的一种产品合格评定制度。年12月,国家…...

UA-DETRAC数据集转YOLO格式

一: 数据集下载 原官方数据集 链接:https://pan.baidu.com/s/1P_CeSIpJIYSA1dykmFhgYw 提取码: 7f4g 处理完成数据集(每10帧取一张) 链接:后续添加 提取码:后续添加 二: 处理标…...

代码随想录---二叉树的总结和二叉树的定义

二叉树的种类: 满二叉树:树的所有节点都是满,即都有左右孩子。 这棵二叉树为满二叉树,也可以说深度为k,有2^k-1个节点的二叉树。 完全二叉树:完全二叉树的定义如下:在完全二叉树中&#xff0c…...

Hive SQL 执行计划

我们在写Hive SQL的时候,难免会在运行的时候有报错,所以知道Hive SQL的执行计划具体是什么,然后假如在之后的运行过程中有报错,可以根据执行计划定位问题,调试自己的SQL开发脚本。 一、含义 Hive SQL的执行计划描述S…...

MySQL InnoDB引擎——三层B+树可以存储多少数据量

先说结论: 3层B树大概可以存: 主键为bigint:约2000w主键为int:约4000w*备注: 在《阿里开发手册》中建议,单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表,如果预计三年后…...

部署跨云容灾的五大难点

为什么企业需要跨云容灾? 据统计,全球已有70%的企业使用云计算服务。上云帮助企业更高效地管理数据资产,但它并非绝对安全。如停电、漏水等机房事故;地震、火灾等自然性灾害;亦或是人为失误,都有可能造成数…...

Docker Compose

为什么需要使用Docker ComposeDocker Compose 容器编排技术1、现在我们有一个springboot项目,需要依赖Redis、mysql、nginx。如果使用docker原生部署的话,则需要安装Redis、mysql、nginx容器,才可以启动我们springboot项目,这样的…...

【ARM架构】armv8 系统安全概述

ARMv8-A 系统中的安全 一个安全或可信的操作系统保护着系统中敏感的信息,例如,可以保护用户存储的密码,信用卡等认证信息免受攻击。 安全由以下原则定义: 保密性:保护设备上的敏感信息,防止未经授权的访问…...

数学小课堂:数学边界

文章目录 引言I 费马大定理1.1毕达哥拉斯定理的推广1.2 一波三折的定理证明过程1.3 希尔伯特第十问题II 数学的边界2.1 认识论问题2.2 在边界内做事情2.3 总结引言 了解数学本身的局限性,才能更好地使用它的原理和思维方式。 数学的边界,这是一个硬的边界,大家不要试图逾越…...

检测中断到来时,让LED灯状态取反,并且在串口工具上打印一句话

任务:检测中断到来时,让LED灯状态取反,并且在串口工具上打印一句话例如:当按键1按下之后,让LED1状态取反,并打印“LED1 down”当按键2按下之后,让LED2状态取反,并打印“LED2 down”当…...

2023年CDGA考试-第7章-数据安全(含答案)

2023年CDGA考试-第7章-数据安全(含答案) 单选题 1.数据安全不仅涉及防止不当访问,也涉及对数据的适当访问,下列理解不正确的是 ( ) A.强密码有助于提高破解风险 B.安全专家建议 45-180天修改一次密码 C.用户要尽量使用多套密码和账户 D.具有高度敏感信息权限的用户都应使…...

输出月份英文名称--C语言实现

任务描述 本关需要你编写一个用指针数组处理的c程序,然后从键盘输入月份时输出对应的英文名。 相关知识 指针 指针是一个变量,其值为另一个变量的地址,即内存位置的直接地址。就像其他变量或常量一样,你必须在使用指针存储其他变量地址之前,对其进行声明。 指针变量声明…...

6年测试经验老鸟:做不好自动化测试,还谈什么高薪?

提起自动化测试,可谓仁者见人,智者见智,心中五味杂陈啊!你从任何一个招聘渠道来看最近两年对测试岗位的要求,几乎都要求会自动化测试。而不少人一直认为手工测试才是王道,工作中有的时候也用不到程序&#…...

Java Web:开篇综述与第一章

前言 翻开这本书,又是一段新的学习路线,在学习的道路上是枯燥的,是乏味的,难免有放弃的想法。但回看曾经的学习笔记,自己也一步一步走过来了,即使会自我怀疑自我否定,但不坚持不努力是永远没有…...

ES6中对象的一些拓展

当对象键名与对应值名相等的时候,可以进行简写 const obj { name }允许字面量定义对象时,将表达式放在括号内 let lastWord last word;const a {first word: hello,[lastWord]: world };a[first word] // "hello" a[lastWord] // "wo…...

10分钟快速入门Pandas库

pandas 是基于NumPy 的一种工具,该工具是为解决数据分析任务而创建的,这篇文章主要介绍了10分钟快速入门Pandas库,重点介绍pandas常见使用方法,结合实例代码介绍的非常详细,需要的朋友可以参考下目录Pandas的介绍pandas 是基于Num…...

考研复试机试 | C++ | 王道机试课程笔记

目录Zero-complexity (上交复试题)题目&#xff1a;代码&#xff1a;括号匹配问题题目&#xff1a;代码&#xff1a;表达式解析问题 &#xff08;浙大机试题&#xff09;题目&#xff1a;代码&#xff1a;标准库里提供了栈 stack<typename> myStack .size() 栈的大小 .pu…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...