前言:前面寫了幾個線程池的工具類涵紊,突然要用到延時任務(wù),居然發(fā)現(xiàn)沒有幔摸,現(xiàn)場擼了一個摸柄,如下。
補:已經(jīng)將前面的ScheduleUtil的定時功能結(jié)合進來了<纫洹G骸!有小修改尿贫,但是用依然5缦薄!庆亡!
創(chuàng)建一個固定長度的線程池匾乓,而且以延遲或定時的方式來執(zhí)行任務(wù)。
ScheduledThreadPool:核心線程池固定又谋,大小無限的線程池拼缝。此線程池支持定時以及周期性執(zhí)行任務(wù)的需求。
/**
* @desc
* @auth 方毅超
* @time 2017/9/27 19:46
*/
public class ScheduledThreadPool {
private static ScheduledExecutorService pool = null;
/*初始化線程池*/
public static void init() {
if (pool == null) {
pool = Executors.newScheduledThreadPool(3);
}
}
/*提交任務(wù)執(zhí)行*/
public static void execute(Runnable r) {
init();
pool.execute(r);
}
/*提交延遲任務(wù)執(zhí)行,1000毫秒*/
public static void executeDelay(Runnable r, long delay) {
init();
pool.schedule(r, delay, TimeUnit.MILLISECONDS);
}
/* 關(guān)閉線程池*/
public static void unInit() {
if (pool == null || pool.isShutdown()) return;
map.clear();
// pool.shutdown();
pool.shutdownNow();
pool = null;
}
//定時任務(wù)////////////////////////////////////////////////////////////////////
/*該接口定義了線程的名字彰亥,用于管理咧七,如判斷是否存活,是否停止該線程等等*/
public interface SRunnable extends Runnable {
String getName();
}
private static HashMap<String, ScheduledFuture> map = new HashMap<>();
/**
* @param sr 需要執(zhí)行測線程任斋,該線程必須繼承SRunnable
* @param delay 延遲執(zhí)行時間 1000毫秒
* @param period 執(zhí)行周期時間 1000毫秒
*/
public static void stard(SRunnable sr, long delay, long period) {
if (sr.getName() == null || map.get(sr.getName()) != null) {
throw new UnsupportedOperationException("線程名不能為空或者線程名不能重復(fù)继阻!");
}
if (pool == null || pool.isShutdown()) init();
ScheduledFuture scheduledFuture = pool.scheduleAtFixedRate(sr, delay, period, TimeUnit.MILLISECONDS);
map.put(sr.getName(), scheduledFuture);
}
/**
* @param sr 停止當前正在執(zhí)行的線程,該線程必須是繼承SRunnable
*/
public static void stop(SRunnable sr) {
if (sr.getName() == null) {
throw new UnsupportedOperationException("停止線程時废酷,線程名不能為空瘟檩!");
}
if (pool == null || pool.isShutdown()) return;//服務(wù)未啟動
if (map.size() > 0 && map.get(sr.getName()) != null) {
map.get(sr.getName()).cancel(true);
map.remove(sr.getName());
}
if (map.size() <= 0) {
unInit();
}
}
/**
* 判斷該線程是否還存活著,還在運行
*
* @param sr
* @return
*/
public static boolean isAlive(SRunnable sr) {
if (map.size() > 0 && map.get(sr.getName()) != null) {
return !map.get(sr.getName()).isDone();
}
return false;
}
}