这几日对接物联网项目,前端请求数据,后端接口发起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去释放线程。