package com.jackson.task; import com.jackson.db.service.IDaoService; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * Created by Jackson on 2016/11/16. * 功能:从service里取出bean,变成task,交给threadPool 执行,内部维护threadPool的缓存大小, * 当到达设定缓存大小时,周期性查看缓存大小如果符合条件则添加任务 */ public abstract class CreateTaskThread<E> extends Thread{ private IDaoService<E> service; private ScheduledThreadPoolExecutor threadPool; private final Logger logger = LogManager.getLogger(this.getClass().getName()); /** * 最大任务缓存数量 */ private int max_task_cache = 40; /** * 最小任务缓存数量,当小于这个数时,就开始创建任务 */ private int min_task_cache = 15; /** * 当没有满足缓存条件时的刷新周期。单位:毫秒 */ private long flush_cycle = 1000; public CreateTaskThread(IDaoService<E> service, ScheduledThreadPoolExecutor threadPool) { this.service = service; this.threadPool = threadPool; } public CreateTaskThread setMaxTaskCache(int cache){ max_task_cache = cache; return this; } public void setService(IDaoService<E> service) { this.service = service; } public CreateTaskThread setMinTaskCache(int cache){ min_task_cache = cache; return this; } public CreateTaskThread setFlushCycle(long cycleMillisecond){ flush_cycle = cycleMillisecond; return this; } @Override public void run() { while(!interrupted()){ if(threadPool.getQueue().size()>max_task_cache){ while(threadPool.getQueue().size()>min_task_cache){ try { logger.info("创建任务线程休息"); Thread.sleep(flush_cycle); } catch (InterruptedException e) { logger.error(e.toString()); } } } E take = service.take(); if(take==null){ try { if(interrupted())return; Thread.sleep(flush_cycle); } catch (InterruptedException e) { logger.error(e.toString()); } }else { long delay = getDelay(take); if(delay<=0){ threadPool.execute(getTask(take)); }else { threadPool.schedule(getTask(take),delay, TimeUnit.MILLISECONDS); } logger.debug("taskCount:{}",threadPool.getQueue().size()); } } } //protected abstract ITask getTask(E obj); protected abstract Runnable getTask(E obj); protected abstract long getDelay(E obj); }