当前位置: 首页 > 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传参唤醒指定线程)

http://www.lryc.cn/news/18266.html

相关文章:

  • 【第一章:Spring概述、特点、IOC容器、IOC操作bean管理(基于xml方式创建对象,注入属性)】
  • 前端react面试题(边面边更)
  • 产品3C认证在哪里办理
  • UA-DETRAC数据集转YOLO格式
  • 代码随想录---二叉树的总结和二叉树的定义
  • Hive SQL 执行计划
  • MySQL InnoDB引擎——三层B+树可以存储多少数据量
  • 部署跨云容灾的五大难点
  • Docker Compose
  • 【ARM架构】armv8 系统安全概述
  • 数学小课堂:数学边界
  • 检测中断到来时,让LED灯状态取反,并且在串口工具上打印一句话
  • 2023年CDGA考试-第7章-数据安全(含答案)
  • 输出月份英文名称--C语言实现
  • 6年测试经验老鸟:做不好自动化测试,还谈什么高薪?
  • Java Web:开篇综述与第一章
  • ES6中对象的一些拓展
  • 10分钟快速入门Pandas库
  • 考研复试机试 | C++ | 王道机试课程笔记
  • 【python科目一:生产线系统设计;激光刀切割材料】
  • Linux——进程概念(进程状态)
  • 超详细:正则表达式从入门到入门
  • jupyter notebook小技巧
  • 考研复试机试 | c++ | 王道复试班
  • js闭包简单理解
  • 「JVM 编译优化」编译器优化技术
  • 回溯问题(子集型回溯、组合型回溯、排列型回溯)【零神基础精讲】
  • 源代码配置安装Apache
  • css水平垂直居中各种方法实现方式
  • PowerShell Install java 13