多线程(线程池)

84 阅读1分钟
public class SinkServiceExecutor {

    /**
     * 线程池核心池的大小
     */
    private static final int CORE_POOL_SIZE = 5;

    /**
     * 线程池的最大线程数
     */
    private static final int MAXIMUM_POOL_SIZE = 8;

    /**
     * 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。
     */
    private static final long KEEP_ALIVE_TIME = 1;

    /**
     * keepAliveTime 的时间单位
     */
    private static final TimeUnit TIME_UNIT = TimeUnit.SECONDS;

    /**
     * 用来储存等待执行任务的队列
     */
    private static final BlockingQueue<Runnable> WORK_QUEUE = new LinkedBlockingDeque<>(10);

    /**
     * 拒绝策略
     */
    private static final RejectedExecutionHandler HANDLER = new ThreadPoolExecutor.CallerRunsPolicy();

    /**
     * 创建线程池
     */
    private static final ThreadPoolExecutor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(
            CORE_POOL_SIZE,
            MAXIMUM_POOL_SIZE,
            KEEP_ALIVE_TIME,
            TIME_UNIT,
            WORK_QUEUE,
            HANDLER
    );

    /**
     * 使用执行器
     */
    private static final ExecutorService EXEC = THREAD_POOL_EXECUTOR;

    public static void submit(Runnable task) {
        EXEC.submit(task);
    }

    public static boolean getPoolQueueIsFull() {
        int capacity = THREAD_POOL_EXECUTOR.getQueue().remainingCapacity();
        if (capacity == 0) {
            // 说明队列已满
            return true;
        } else {
            return false;
        }
    }

    public static BlockingQueue<Runnable> getPoolQueue() {
        return THREAD_POOL_EXECUTOR.getQueue();
    }

}

调用方式

if (sinkDbSign) {
    // 数据放入队列
    while (SinkServiceExecutor.getPoolQueueIsFull()) {
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
    SinkServiceExecutor.submit(new Runnable() {
        @Override
        public void run() {
            try {
                umelogger.info("开始进行数据落库 " + JSONObject.toJSONString(bean));
                allActivityDataServiceService.update(bean);
                umelogger.info("数据落库完成");
            } catch (Exception e) {
                log.error("调用落库update接口异常 " + JSONObject.toJSONString(bean));
            }
        }
    });
}

拒绝策略:拒绝策略中有四种: CallerRunsPolicy是阻塞等待