SpringBoot安全线程锁工具类[通俗易懂]

SpringBoot安全线程锁工具类[通俗易懂]这几日对接物联网项目,前端请求数据,后端接口发起TCP请求,由另一个线程来接收数据,这时候需要阻塞前端发起的请求,直到TCP接收数据完毕,再返回数据给前端。特此写了一个工具类importjava.util.concurrent.ConcurrentHashMap;importjava.util.concurrent.locks.LockSupport;publicclassLockSupportUtil{//存放线程引用的全局容器publicstaticfina

大家好,又见面了,我是你们的朋友全栈君。

这几日同事对接物联网设备,说前端请求数据,后端接口发起TCP请求,由另一个线程来接收数据,必须待tcp接受完毕才能返回前端,这时候需要阻塞前端发起的请求,直到TCP接收数据完毕,再返回数据给前端。特此写了一个工具

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.LockSupport;

public class LockSupportUtil {
    //存放线程引用的全局容器
    public static final ConcurrentHashMap<Integer, Thread> Thread_Pointer_Map = new ConcurrentHashMap<>();

    /**
     * 锁住线程
     *
     * @param address     存放线程的Key,建议使用System.identityHashCode(Thread.currentThread())来生产Key
     * @param thread      线程对象
     * @param millisecond 超时自动释放线程
     * @return
     */
    public static void lock(int address, Thread thread, long millisecond) {
        //如果地址被占用,则直接释放掉
        Thread thread001 = Thread_Pointer_Map.get(address);
        if (thread001 != null) {
            LockSupport.unpark(thread001);
            Thread_Pointer_Map.remove(address);
        }
        Thread_Pointer_Map.put(address, thread);
        LockSupport.parkUntil(thread, System.currentTimeMillis() + millisecond);
    }

    /**
     * 释放线程
     *
     * @param address 线程Key
     */
    public static void unlock(int address) {
        Thread thread = Thread_Pointer_Map.get(address);
        if (thread != null) {
            LockSupport.unpark(thread);
            Thread_Pointer_Map.remove(address);
        }
    }
}

使用:发起TCP请求的时候带上生成的线程Key,也就是address。TCP异步返回数据的时候带上这个Key。然后用这个Key去释放线程。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149132.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • noip2012提高组初赛_noip2018提高组初赛解析

    noip2012提高组初赛_noip2018提高组初赛解析Noip2012参赛总结又一年NOIP考完了。刚刚才看了去年自己写的参赛总结,有点后悔考试之前没有看。里面有一句话“NOIP给的数据都是白痴的,一定要多测几组自己的数据,尽管有些数据你相信你的程序一定能过。但往往正是这些数据暴露出了你程序的不足。”对于DAY1的第二题。我想用深搜来做,尽管我知道过不了多少个点,但总比没有好。于是就以很快的速度敲完了深搜,测了两组数据就去做第三题了。离考试

    2022年8月22日
    7
  • F分布的概率密度函数_F分布的统计量是

    F分布的概率密度函数_F分布的统计量是定义:设X1∼χ2(m),X2∼χ2(n)X_{1}\sim\chi^{2}(m),X_{2}\sim\chi^{2}(n)X1​∼χ2(m),X2​∼χ2(n),X1X_{1}X1​与X2X_{2}X2​相互独立,则称随机变量F=X1/mX2/nF=\frac{X_{1}/m}{X_{2}/n}F=X2​/nX1​/m​服从自由度为mmm及nnn的FFF分布,mmm称为第一自由度,n\boldsymbol{n}n称为第二自由

    2022年10月10日
    4
  • 单据保存后的存储过程称为_原始单据保存多少年

    单据保存后的存储过程称为_原始单据保存多少年(一)报关单证保存后的存储过程更新T_modulelist的StorageProductAfterSave值UPDATET_ModuleListSETStorageProductAfterSave=‘SaveInvoiceAfter’wheremodulename=‘报关单证’2.创建存储过程CREATEPROCSaveInvoiceAfter(@InvoiceNumvarchar(30))AsBegin…写你的逻辑,其中参数@InvoiceNum是单据号end(二)出

    2022年9月21日
    4
  • 一条语句改变进度条颜色及去掉进度条边框

    一条语句改变进度条颜色及去掉进度条边框 一、        改变进度条颜色 在VC里想改变进度条颜色,在网上找了很多方法,都很麻烦,觉得很郁闷。后来想起在用VB做时,增经用API实现过,很简单。后来再一查,原来是SendMessage这个函数,几经试验,终于成功,高兴,与大家分享!!!!      代码如下:          m_Progress1.SendMessage(PBM_SETBKCOLOR,0,R

    2022年7月14日
    15
  • r语言t检验输出检验统计量_两样本t检验原理与R语言实现

    r语言t检验输出检验统计量_两样本t检验原理与R语言实现t检验也称为studentt检验,可以用来比较两个均值的差异是否显著,可分为单总体检验、双总体检验、配对样本检验。1.1历史要了解t检验,就不得不提及他的发明者威廉·西利·戈塞特(WilliamSealyGosset)。戈塞特先生作为一个拥有化学和数学两个学位的牛津大学新秀,于1899年因化学专长进入爱尔兰都柏林的吉尼斯酿造公司工作。戈塞特先生在公司解决的第一个难题是:如何准确测量一个瓶中酵…

    2022年6月19日
    34
  • vdbench配置说明[通俗易懂]

    vdbench配置说明[通俗易懂]一、前言1、介绍 vdbench是一个I/O工作负载生成器,通常用于验证数据完整性和度量直接附加(或网络连接)存储性能。它可以运行在windows、linux环境,可用于测试文件系统或块设备基准性能。2、版本包获取vdbench版本包下载链接:http://download.oracle.com/otn/utilities_drivers/vdbench/vdbench50406.zipjdk版本包下载链接(windows):https://download.oracle.com/

    2022年5月19日
    86

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号