All Downloads are FREE. Search and download functionalities are using the official Maven repository.

vip.breakpoint.cache.TtlClearContext Maven / Gradle / Ivy

package vip.breakpoint.cache;

import vip.breakpoint.utils.ExecutorServiceUtils;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * 专门清理缓存的线程
 *
 * @author : breakpoint/[email protected]
 * create on 2022/11/25
 * 欢迎关注公众号:代码废柴
 */
public class TtlClearContext {

    private static final long DEFAULT_INTERVAL_TIMES = 1000L;

    private static volatile boolean running = true;

    private static volatile boolean haveStared = false;

    private static final class ExecutorServiceClass {
        // 单例模式 并且使用的时候再 初始化 节省资源
        private static final ExecutorService executor =
                ExecutorServiceUtils.getExecutorService(() -> 10, () -> 20, () -> 200L,
                        TimeUnit.MILLISECONDS, 200);
    }

    private static final List> ttlCacheList = new CopyOnWriteArrayList<>();

    private static final ReadWriteLock lock = new ReentrantReadWriteLock();

    private static void startExecute(long clearIntervalTimes) {
        if (!haveStared) {
            synchronized (TtlClearContext.class) {
                if (!haveStared) {
                    if (clearIntervalTimes < DEFAULT_INTERVAL_TIMES)
                        throw new IllegalArgumentException("clearIntervalTimes must be bigger than "
                                + DEFAULT_INTERVAL_TIMES + "ms");
                    ExecutorServiceClass.executor.execute(() -> {
                        while (running) {
                            Lock readLock = TtlClearContext.lock.readLock();
                            try {
                                if (readLock.tryLock(200, TimeUnit.MILLISECONDS)) {
                                    for (TtlCache ttlCache : ttlCacheList) {
                                        ttlCache.clearExpireData();

                                    }
                                }
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            } finally {
                                readLock.unlock();
                            }
                            if (!running) {
                                break;
                            }
                            try {
                                Thread.sleep(clearIntervalTimes);
                            } catch (final InterruptedException ignored) {
                                // ignore
                            }
                        }
                    });
                    // started
                    haveStared = true;
                }
            }
        }
    }

    public static  void addClearCache(TtlCache ttlCache) {
        startExecute(DEFAULT_INTERVAL_TIMES);
        Lock writeLock = lock.writeLock();
        while (true) {
            try {
                if (writeLock.tryLock(200, TimeUnit.MILLISECONDS)) {
                    ttlCacheList.add(ttlCache);
                    break;
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                writeLock.unlock();
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy