rain
2024-03-28 a83ae77a98e235cdca07a1bb167a9a43479a2c9a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.dji.sample.component.mqtt.model;
 
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<T> {
 
    private static final long THREAD_WAIT_TIME = 1000_000L * 10_000;
 
    private volatile T data;
 
    private volatile Thread t;
 
    private Chan () {
 
    }
 
    public static Chan getInstance() {
        return ChanSingleton.INSTANCE;
    }
 
    public T get(Object blocker) {
        this.t = Thread.currentThread();
        LockSupport.parkNanos(blocker, THREAD_WAIT_TIME);
        this.t = null;
        return data;
    }
 
    public void put(T data) {
        this.data = data;
        if (t == null) {
            return;
        }
        LockSupport.unpark(t);
    }
 
    private static class ChanSingleton {
        private static final Chan<?> INSTANCE = new Chan<>();
    }
}