工作线程
public abstract class WorkThread implements Runnable, Serializable{
/** 线程池的参数是否改变 */
private boolean isPoolSizeAliveTimeModf = false;
/** JDK 线程池 spring封装 扩展实现的线程池 */
private MyThreadPoolTaskExecutor taskExecutor;
/** 核心线程数 */
private static int corePoolSize;
/** 最大线程数 */
private static int maximumPoolSize;
/** 线程池维护线程所允许的空闲时间 */
private static int keepAliveTime;
public WorkThread(TaskExecutor taskExecutor) {
this.taskExecutor = (MyThreadPoolTaskExecutor) taskExecutor;
}
public final void run() {
try {
// 如果线程池参数有变化,则重置
if (isPoolSizeAliveTimeModf()) {
taskExecutor.setCorePoolSize(corePoolSize);
taskExecutor.setMaxPoolSize(maximumPoolSize);
taskExecutor.setKeepAliveSeconds(keepAliveTime);
}
//抽象函数,供子类实现
doTask();
} catch (Exception e) {
e.printStackTrace();
}
}
//任务工作
public abstract void doTask() throws Exception;
//获取缓冲队列QUEUE,用于维护监控
public BlockingQueue getQueue() {
return taskExecutor.getThreadPoolExecutor().getQueue();
}
//获取队列size,用于维护监控
public int getQueueSize() {
if (this.getQueue() instanceof LinkedBlockingQueue) {
return this.getQueue().size();
} else {
return this.getQueue().size();
}
}
//如果线程池中的参数有变化,自动调用update方法
public void update(Observable observable, Object obj) {
if (obj instanceof Map) {
HashMap<String, Integer> poolMap = (HashMap<String, Integer>) obj;
//打印 线程池 历史大小 和 要更改的大小
corePoolSize = poolMap.get("corePoolSize");
maximumPoolSize = poolMap.get("maximumPoolSize");
keepAliveTime = poolMap.get("keepAliveTime");
//一定要把值设到线程池中
taskExecutor.setCorePoolSize(corePoolSize);
taskExecutor.setMaxPoolSize(maximumPoolSize);
taskExecutor.setKeepAliveSeconds(keepAliveTime);
}
}
public MyThreadPoolTaskExecutor getTaskExecutor() {
return taskExecutor;
}
public void setMaximumPoolSize(int maximumPoolSize) {
this.maximumPoolSize = maximumPoolSize;
}
public boolean isPoolSizeAliveTimeModf() {
return isPoolSizeAliveTimeModf;
}
public void setKeepAliveTime(int keepAliveTime) {
this.keepAliveTime = keepAliveTime;
}
}