SynchronizeSignal.java 1.17 KB
package vc.thinker.utils;

import lombok.Data;

import java.time.Duration;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 同步信号通信
 *
 * @author HeTongHao
 * @since 2020/7/9 19:50
 */
@Data
public class SynchronizeSignal {
    public SynchronizeSignal() {
        this(new ReentrantLock());
    }

    public SynchronizeSignal(Lock lock) {
        this.lock = lock;
        this.condition = this.lock.newCondition();
    }

    private Lock lock;
    private Condition condition;


    public void signal() {
        lock.lock();
        try {
            condition.signal();
        } finally {
            lock.unlock();
        }
    }

    public boolean await(Duration duration) {
        return await(duration.toMillis(), TimeUnit.MILLISECONDS);
    }

    public boolean await(long time, TimeUnit unit) {
        lock.lock();
        try {
            return condition.await(time, unit);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
        return false;
    }
}