大家好,又见面了,我是你们的朋友全栈君。
这几日同事对接物联网设备,说前端请求数据,后端接口发起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账号...