import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
/**
* <p>
* Description: 任务调度支持类 <br>
* 当调度执行完或者中断都需要把该任务从任务调度池中删除掉, 这样是为了避免池中垃圾对象积累。 <br>
* <br>
* <code>
* public void run() {<br>
* <pre>// do something...</pre>
* <pre>ScheduleProcessSupport.remove(key);</pre>
* }
* </code>
* </p>
* */
public class ScheduledSupport {
private static Map<String, ScheduledFuture<?>> scheduleFutureMap = ScheduledProcessPool.INSTANCE.getPool();
private static ScheduledExecutorService scheduledService = ScheduledThreadPool.INSTANCE.getPool();
/**
* <p>
* Description: 获取任务调度
* </p>
*
* @param key
* 主键
* @return
*/
private static ScheduledFuture<?> getScheduledFutrue(String key) {
ScheduledFuture<?> future = scheduleFutureMap.get(key);
removeScheduled(key);
return future;
}
/**
* <p>
* Description: 取消任务调度
* </p>
*
* @param key
*/
private static void cancelScheduled(String key) {
ScheduledFuture<?> future = getScheduledFutrue(key);
if (future != null && !future.isDone()) {
future.cancel(true);
}
}
/**
* <p>
* Description: 创建延迟任务
* </p>
*
* @param key
* 主键
* @param thread
* 线程
* @param delay
* 延迟执行时间
* @param timeUnit
* 延迟参数的时间单位
*/
public static void schedule(String key, Thread thread, long delay, TimeUnit timeUnit) {
cancelScheduled(key);
scheduleFutureMap.put(key, scheduledService.schedule(thread, delay, timeUnit));
}
/**
* <p>
* Description: 创建延迟任务
* </p>
*
* @param key
* 主键
* @param thread
* 线程
* @param delay
* 延迟执行时间(单位:秒)
*/
public static void scheduleDelaySeconds(String key, Thread thread, long delay) {
schedule(key, thread, delay, TimeUnit.SECONDS);
}
/**
* <p>
* Description: 移除任务调度
* </p>
*
* @param key
* 主键
* @return
*/
public static void removeScheduled(String key) {
if (scheduleFutureMap.containsKey(key)) {
Iterator<String> it = scheduleFutureMap.keySet().iterator();
while (it.hasNext()) {
if (it.next().equalsIgnoreCase(key)) {
it.remove();
break;
}
}
}
}
/**
* <p>
* Description: 获取调度池容量
* </p>
*
* @return
*/
public static int getScheduledPoolSize() {
return scheduleFutureMap.size();
}
}
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
/**
* <p>
* Description: 任务调度池
* </p>
* */
public enum ScheduledProcessPool {
INSTANCE;
private Map<String, ScheduledFuture<?>> scheduledPool;
/** 调度池初始容量 */
private int initialCapacity = 50;
private ScheduledProcessPool() {
scheduledPool = new ConcurrentHashMap<String, ScheduledFuture<?>>(initialCapacity);
}
/**
* <p>
* Description: 获取任务调度池
* </p>
*
* @return
*/
public Map<String, ScheduledFuture<?>> getPool() {
return scheduledPool;
}
}
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
/**
* <p>
* Description: 任务线程池
* </p>
* */
public enum ScheduledThreadPool {
INSTANCE;
/** 线程池初始容量 */
private int corePoolSize = 50;
private ScheduledExecutorService exec;
private ScheduledThreadPool() {
exec = Executors.newScheduledThreadPool(corePoolSize, new ThreadFactoryBuilder().setNamePrefix("VIVO-H5-Thread")
.setDaemon(false).setPriority(Thread.MAX_PRIORITY).build());
}
/**
* <p>
* Description: 获取任务线程池
* </p>
*
* @return
*/
public ScheduledExecutorService getPool() {
return exec;
}
}
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicLong;
/**
* <p>
* Description: 自定义线程工厂
* </p>
* */
public class ThreadFactoryBuilder {
private String namePrefix = null;
private boolean daemon = false;
private int priority = Thread.NORM_PRIORITY;
public ThreadFactoryBuilder setNamePrefix(String namePrefix) {
if (namePrefix == null) {
throw new NullPointerException();
}
this.namePrefix = namePrefix;
return this;
}
public ThreadFactoryBuilder setDaemon(boolean daemon) {
this.daemon = daemon;
return this;
}
public ThreadFactoryBuilder setPriority(int priority) {
if (priority < Thread.MIN_PRIORITY) {
throw new IllegalArgumentException(
String.format("Thread priority (%s) must be >= %s", priority, Thread.MIN_PRIORITY));
}
if (priority > Thread.MAX_PRIORITY) {
throw new IllegalArgumentException(
String.format("Thread priority (%s) must be <= %s", priority, Thread.MAX_PRIORITY));
}
this.priority = priority;
return this;
}
public ThreadFactory build() {
return build(this);
}
private static ThreadFactory build(ThreadFactoryBuilder builder) {
final String namePrefix = builder.namePrefix;
final Boolean daemon = builder.daemon;
final Integer priority = builder.priority;
final AtomicLong count = new AtomicLong(0);
return new ThreadFactory() {
@Override
public Thread newThread(Runnable runnable) {
Thread thread = new Thread(runnable);
if (namePrefix != null) {
thread.setName(namePrefix + "-" + count.getAndIncrement());
}
if (daemon != null) {
thread.setDaemon(daemon);
}
if (priority != null) {
thread.setPriority(priority);
}
return thread;
}
};
}
}