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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux删除用户名命令,linux删除用户命令

    linux删除用户名命令,linux删除用户命令Linux下删除以后的时候我们需要通过相关的命令来实现。下面由学习啦小编为大家整理linux删除用户命令的相关知识,希望对大家有帮助!linux删除用户命令简介userdel是一个底层用于删除用户的工具。在Debian上,我们通常会使用deluser命令。userdel会查询系统账户文件,例如/etc/password和/etc/group。那么它会删除所有和用户名相关的条目。在…

    2022年6月8日
    38
  • 易经六十四卦详解与应用_六十四卦推演方法

    易经六十四卦详解与应用_六十四卦推演方法文章目录六十四卦图卦象工具/原料方法/步骤注意事项六十四卦图卦象工具/原料一块钱的硬币 三枚方法/步骤第一,占卜前要把手洗干净,然后心里要虔诚,其他的事情不要胡思乱想,心里就想着自己要占卜问的事情。第二,取出三枚一元的硬币,有一元字体的为正面,花的那面为反面。然后将三枚硬币放在手中,双手合拢摇晃几下,最后开出来。结果的话有四种情况。三个全是正面的记作老阳——x,只有一个正面…

    2022年8月18日
    12
  • C++线程池QueueUserWorkItem

    C++线程池QueueUserWorkItem在计算机程序中,线程是一种很重要的资源,使用的恰当可以极大的提高程序的效率,也就是多线程的使用,但是多线程会让应用程序变得异常复杂,会占用大量的系统资源。就像QQ表情一样,每一个QQ表情的闪动都需要构建一个线程,如果用户使用了大量的表情(GIF),将会有多少个线程在运行,系统的性能将大大减少,甚至导致死机。在这种情况下,多线程变得不太合适了,那么什么机制适用于这种情况下呢,这就是线程池。通

    2025年8月7日
    2
  • 怎么花最少的钱提升出租屋的格调?

    怎么花最少的钱提升出租屋的格调?发条橘子667 ,一个脱离了高级趣味的人。可可苏玛 等 12288 人赞同@ 在我到上海一年零八个月的时候,我从原来的公司辞职了,之后我又双叒叕搬家了。新租的房子在漕河泾开发区附近,39平的一居室。是我能在这一带找到的最便宜的一居室。租赁合同上表明该公寓始建于1972年,因此整体的装修风格非常…怎么说呢…复古。基本上屋里每

    2022年6月23日
    23
  • 使用cloudsim进行云计算仿真步骤_公司分析中最重要的是

    使用cloudsim进行云计算仿真步骤_公司分析中最重要的是CloudSimExample1展示如何创建一个只包含一个主机的数据中心,并且在其上运行一个云任务。首先附上CloudSimExample1全部代码:packageorg.cloudbus.cloudsim.examples;/**Title:CloudSimToolkit*Description:CloudSim(CloudSimulation…

    2022年10月13日
    4
  • linux ubuntu 关闭防火墙命令,Linux下开启/关闭防火墙命令「建议收藏」

    iptables用于过滤数据包,属于网络层防火墙.firewall能够允许哪些服务可用,那些端口可用….属于更高一层的防火墙。firewall的底层是使用iptables进行数据过滤,建立在iptables之上。1)永久性生效,重启后不会复原开启:chkconfigiptableson关闭:chkconfigiptablesoff2)即时生效,重启后复原开启:service…

    2022年4月9日
    211

发表回复

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

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