线程间通信LockSupport的parkunpark 野性酷女 2022-09-11 01:18 149阅读 0赞 LockSupport是jdk自带的线程阻塞、唤醒工具类 此工具类属于juc包的一部分,所在包路径:java.util.concurrent.locks.LockSupport。 ![clipboard][] **LockSupport类使用了一种名为Permit(许可)的概念来做到阻塞和唤醒线程的功能,可以把许可看成是一种(0,1)信号量(Semaphore),但与 Semaphore 不同的是,许可的累加上限是1。** 初始时,permit为0,当调用unpark()方法时,线程的permit加1,当调用park()方法时,如果permit为0,则调用线程进入阻塞状态。 使用LockSupport实现线程的阻塞和唤醒 package com.dongguo.sync; import java.util.concurrent.locks.LockSupport; /** * @author Dongguo * @date 2021/8/24 0024-17:15 * @description: LockSupport示例 */ public class ThreadDemo5 { static boolean flag = true; static Thread threadA; public static void main(String[] args) { DemoClass demoClass = new DemoClass(); threadA = new Thread(() -> { demoClass.increment(); }, "ThreadA"); threadA.start(); new Thread(() -> { demoClass.decrement(); }, "ThreadB").start(); } static class DemoClass { private int number = 0; //加一 public void increment() { try { while (true) { while (number != 0) { LockSupport.park(); } if (flag) { number++; System.out.println(Thread.currentThread().getName() + "+1值为:" + number); flag = false; } } } catch (Exception e) { e.printStackTrace(); } } //减一 public void decrement() { try { while (true) { if (!flag) { number--; System.out.println(Thread.currentThread().getName() + "-1值为:" + number); flag = true; } LockSupport.unpark(threadA); } } catch (Exception e) { e.printStackTrace(); } } } } ![image-20210910145051029][] 通过LockSupport的这两个方法,可以很方便的阻塞和唤醒线程。但是LockSupport的使用过程中还需要注意以下几点: 1. **park**方法的调用一般要方法一个循环判断体里面。 2. park方法是会响应中断的,但是不会抛出异常。(也就是说如果当前调用线程被中断,则会立即返回但不会抛出中断异常) 3. park的重载方法park(Object blocker),会传入一个blocker对象,所谓Blocker对象,其实就是当前线程调用时所在调用对象(如上述示例中的FIFOMutex对象)。该对象一般供监视、诊断工具确定线程受阻塞的原因时使用。 [clipboard]: /images/20220829/da3658266dde489db1647bb6100fd869.png [image-20210910145051029]: /images/20220829/854c18f46b614bf6b2213bccb2bd8e9b.png
相关 单线程间通信 多线程间通信 单线程间通信 <table> <thead> <tr> <th align="left">首先实现一个EventQueue,该Queue有如下三种状 朱雀/ 2024年03月16日 11:51/ 0 赞/ 90 阅读
相关 线程间的通信 1、什么是多线程之间通信 多个线程在处理同一个资源,并且任务不同时,需要线程通信来帮助解决线程之间对同一个变量的使用或操作。 于是我们引出了等待唤醒机制: 梦里梦外;/ 2023年10月05日 15:38/ 0 赞/ 18 阅读
相关 线程间通信LockSupport的parkunpark LockSupport是jdk自带的线程阻塞、唤醒工具类 此工具类属于juc包的一部分,所在包路径:java.util.concurrent.locks.LockSuppor 野性酷女/ 2022年09月11日 01:18/ 0 赞/ 150 阅读
相关 线程间通信 为什么需要线程通讯 线程是操作系统调度的最小单位,有自己的栈空间,可以按照既定的代码逐步的执行,但是如果每个线程间都孤立的运行,那就会造资源浪费。所以在现实中,我们需要这 心已赠人/ 2022年09月08日 00:12/ 0 赞/ 297 阅读
相关 线程间的通信 https://www.cnblogs.com/hapjin/p/5492619.html 通常可用把并行程序理解为一组相互独立的、能够发关和接收消息的组件,这也称为角 朱雀/ 2022年05月17日 03:00/ 0 赞/ 165 阅读
相关 线程间通信 线程和线程之间不是独立的个体,它们彼此之间可以互相通信和协作。 线程通信就是在线程之间传递信息,保证他们能够协同工作。在线程间进行通信后,系统之间的交互性会更强大,在大大提高 Myth丶恋晨/ 2022年05月17日 01:36/ 0 赞/ 304 阅读
相关 线程间通信 注意: 必须在同步方法中使用wait和notify方法,因为执行wait和notify的前提条件是必须持有同步方法(或块)的monitor的所有权,否则将会抛出异常 女爷i/ 2022年02月28日 09:33/ 0 赞/ 413 阅读
相关 线程间的通信 典型例子就是生产者-消费者模式,仓库为空时,消费者无法从仓库调动产品,只能wait,直到仓库有产品时被notify;仓库满了时,生产者则暂时停止生产(wait),直到仓库有空被 喜欢ヅ旅行/ 2022年01月29日 10:34/ 0 赞/ 289 阅读
相关 线程间通信 一、线程间通信 1. 需要三个重要的方法:(java.lang.Object包下) 三种方法使用之前一定要加锁 ①wait() ②n 缺乏、安全感/ 2021年09月28日 14:14/ 0 赞/ 419 阅读
还没有评论,来说两句吧...