package com.dji.sdk.mqtt;
|
|
import java.util.Objects;
|
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.locks.LockSupport;
|
|
/**
|
* The demo is only for functional closure, which is not recommended.
|
* @author sean.zhou
|
* @date 2021/11/22
|
* @version 0.1
|
*/
|
public class Chan {
|
|
private static final ConcurrentHashMap<String, Chan> CHANNEL = new ConcurrentHashMap<>();
|
|
private static final int UNIT = 1000_000;
|
|
private volatile CommonTopicResponse data;
|
|
private volatile Thread t;
|
|
private Chan () {
|
|
}
|
|
public static Chan getInstance(String tid, boolean isNeedCreate) {
|
if (!isNeedCreate) {
|
return CHANNEL.get(tid);
|
}
|
Chan chan = new Chan();
|
CHANNEL.put(tid, chan);
|
return chan;
|
}
|
|
public CommonTopicResponse get(String tid, long timeout) {
|
Chan chan = CHANNEL.get(tid);
|
if (Objects.isNull(chan)) {
|
return null;
|
}
|
chan.t = Thread.currentThread();
|
LockSupport.parkNanos(chan.t, timeout * UNIT);
|
chan.t = null;
|
CHANNEL.remove(tid);
|
return chan.data;
|
}
|
|
public void put(CommonTopicResponse response) {
|
Chan chan = CHANNEL.get(response.getTid());
|
if (Objects.isNull(chan)) {
|
return;
|
}
|
chan.data = response;
|
if (chan.t == null) {
|
return;
|
}
|
LockSupport.unpark(chan.t);
|
}
|
}
|