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去释放线程。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • pycharm社区版激活码2021破解方法

    pycharm社区版激活码2021破解方法,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 浅谈单工,半双工和全双工有何区别和联系?[通俗易懂]

    浅谈单工,半双工和全双工有何区别和联系?

  • 剑指offer:二进制中1的个数(Python)& 0xffffffff

    剑指offer:二进制中1的个数(Python)& 0xffffffff题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解题思路思路1首先,这种基础的求二进制中1的个数的问题,对于强大的Python,一定存在一些好用的库函数。果不其然,代码如下:Python代码1defNumberOf1(self,n):ifn>=0:returnbin(n).count(‘1’)else…

  • 【Firebug入门指南】「建议收藏」

    据说,对于网页开发人员来说,Firebug是Firefox浏览器中最好的插件之一。…

  • web页面请求的整个过程_HTTP的请求方法

    web页面请求的整个过程_HTTP的请求方法HTTP请求的完全过程1.1浏览器根据域名解析IP地址浏览器根据访问的域名找到其IP地址。DNS查找过程如下:浏览器缓存:首先搜索浏览器自身的DNS缓存(缓存的时间比较短,大概只有1分钟,且只能容纳1000条缓存),看自身的缓存中是否是有域名对应的条目,而且没有过期,如果有且没有过期则解析到此结束。 系统缓存:如果浏览器自身的缓存里面没有找到对应的条目,那么浏览器会…

  • PID控制的MATLAB仿真(1)

    PID控制的MATLAB仿真(1)PID控制应用广泛,说起来PID特别的简单,在比例负反馈的基础上加入微分项实现快速调节,加入积分项实现无静差。MATLAB强大的功能让学习变得非常简单。在学习智能控制这门课的时候,老师推荐了刘金琨老师的先进PID控制一书,边看边学边调程序。下文程序选自此书。首先从模拟PID开始,被控系统一般是下图这种结构:其中PID控制器:一种用模拟PID控制的磁悬浮:电路图左侧是霍尔传

发表回复

您的电子邮箱地址不会被公开。

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