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


相关推荐

  • 面试 设计题_设计模式面试题及答案

    面试 设计题_设计模式面试题及答案文章目录设计模式什么是设计模式为什么要学习设计模式设计模式分类设计模式的六大原则开放封闭原则(OpenClosePrinciple)里氏代换原则(LiskovSubstitutionPrinciple)依赖倒转原则(DependenceInversionPrinciple)接口隔离原则(InterfaceSegregationPrinciple)迪米特法则(最少知道原则)(Deme…

    2022年9月13日
  • pytest的assert_assert是什么意思

    pytest的assert_assert是什么意思前言断言是写自动化测试基本最重要的一步,一个用例没有断言,就失去了自动化测试的意义了。什么是断言呢?简单来讲就是实际结果和期望结果去对比,符合预期那就测试pass,不符合预期那就测试failed

    2022年7月30日
  • 在线客服系统源码(PHP完全开源版)

    在线客服系统源码(PHP完全开源版)在线客服系统软件使开发和运营团队能够高速协作,因此要求源码系统能够快速响应业务变化,并快速提供出色的客户和员工服务体验。  在线客服源码演示及获取:https://gitee.com/wang_li989/kfxt  客服沟通问题加起来会成为重大的财务损失。您的组织快速有效地解决这些问题的能力直接影响到未满足的SLA义务和客户体验,这两个方面对公司的成功至关重要。在线客服系统是企业战略的核心组成部分。通过减少识别和解决问题所需的时间,您的组织可以提高客户忠诚度,最大限度地延长正常运行时间,并提供始终如

    2022年7月19日
  • Hadoop、Yarn和vcpu资源的配置

    Hadoop、Yarn和vcpu资源的配置

    2022年3月13日
  • CSS布局模型_如何将模型导入布局

    CSS布局模型_如何将模型导入布局CSS布局:Flow,Float,Layer(absolute,relative,fixed),堆叠控制

    2022年10月28日
  • javaWeb学习——servlet、filter、listener、intercept的区别

    javaweb开发有很多技术要学习,首先将简单的概念和基础打好,然后才能更好的成长! 自己整理一遍,记忆深刻一点! 一:概念二:实现方式三:执行逻辑图参考:http://www.cnblogs.com/shangxiaofei/p/5328377.htmlhttp://blog.csdn.net/lzwjavaphp/article/details/13771109

    2022年2月25日

发表回复

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

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