package common.util;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;/**線程工具類*/public class ThreadUtil {/**長時間軸程池的最大線程數量*/private static final int MAX_THREAD = 2;/**長時間軸程的逾時時間,如果線程執行時間超過這個時間會自動釋放*/private static final int LONG_TIMEOUT_TIME = 60000;/**短時間軸程的逾時時間,如果線程執行時間超過這個時間會自動釋放*/private static final int SORT_TIMEOUT_TIME = 12000;/**長時間軸程池,用於執行短時間較長的線程,需要設定最大線程數量*/private static ExecutorService longTimeThreadPool = Executors.newFixedThreadPool(MAX_THREAD);/**短時間軸程池,用於存放執行時間較短的線程,無需設定線程的最大數量*/private static ExecutorService sortTimeThreadPool = Executors.newCachedThreadPool();/** * 建立一個線程,將線程放到短時間軸程池中,並且啟動一個守護線程監控線程逾時 * * * @param runnable:需要啟動並執行線程 * * @throws Exception * */public static synchronized void getSortTimeOutThread(Runnable runnable){//將線程提交到短時間軸程池中,然後會得到一個FutureFuture<String> future = (Future<String>) sortTimeThreadPool.submit(runnable);//啟動一個守護線程,這個線程將計算逾時new ThreadUtil().monitorThreadTime(SORT_TIMEOUT_TIME,future);}/** * 建立一個線程,將線程放到長時間軸程池中,並且啟動一個守護線程監控線程逾時 * * * @param runnable:需要啟動並執行線程 * * @throws Exception * */public static synchronized void getLongTimeOutThread(Runnable runnable) throws Exception{//將線程提交到短時間軸程池中,然後會得到一個FutureFuture<String> future = (Future<String>) longTimeThreadPool.submit(runnable);//啟動一個守護線程,這個線程將計算逾時new ThreadUtil().monitorThreadTime(LONG_TIMEOUT_TIME,future);}/** * 建立一個線程,將線程放到長時間軸程池中,並且啟動一個守護線程監控線程逾時 * * * @param runnable:需要啟動並執行線程 * @param timeOutTime:自訂的逾時時間 * * @throws Exception * */public static synchronized void getLongTimeOutThread(Runnable runnable,int timeOutTime) throws Exception{//將線程提交到短時間軸程池中,然後會得到一個FutureFuture<String> future = (Future<String>) longTimeThreadPool.submit(runnable);//啟動一個守護線程,這個線程將計算逾時new ThreadUtil().monitorThreadTime(timeOutTime,future);}/** * 監控線程逾時守護線程,到逾時時間去查看一下線程狀態,如果正在執行中則停止線程(這段有問題) * * @param timeOutTime:逾時時間 * @param future:執行結果表單,將用來計算逾時 * * * */private void monitorThreadTime(int timeOutTime,Future<String> future){//執行守護線程new Thread(new Runnable() {@Overridepublic void run() {//等待一段時間,然後調用執行結果,如果沒有執行完,則試著去結束try {Thread.sleep(timeOutTime);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}//判斷future是否執行完成,如果逾時未完成,則試著結束線程if(!future.isDone()){//false表示不允許線程執行時中斷,true表示允許future.cancel(true);}}}).start();}}
守護線程監控逾時的代碼有問題,後面我找到問題了會更新,現在最好屏蔽掉