java設置一段代碼執行超時時間

前段時間在搞一個批量處理程序,涉及到多線程操作。但是後臺服務很不給力,併發一大常常就掛了,長時間不給返回,導致我的程序也掛死在那裏…… 

那麼能不能設置一段代碼執行的超時時間呢?如果處理超時就忽略該錯誤繼續向下執行。 

可是在網上搜了大半天,找到的都是無用的代碼,根本不能用。 

查了大量資料後發現,java早已經給我們提供瞭解決方案。jdk1.5自帶的併發庫中Future類就能滿足這個需求。Future類中重要方法包括get()和cancel()。get()獲取數據對象,如果數據沒有加載,就會阻塞直到取到數據,而 cancel()是取消數據加載。另外一個get(timeout)操作,表示如果在timeout時間內沒有取到就失敗返回,而不再阻塞。 

到這裏,此問題就迎刃而解了。廢話不多說,直接上代碼: 

  1. import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;


    import com.sun.corba.se.impl.orbutil.closure.Future;
    import com.sun.corba.se.impl.orbutil.threadpool.TimeoutException;
  2. public class ThreadTest {  
  3.   
  4.     public static void main(String[] args) throws InterruptedException,  
  5.             ExecutionException {  
  6.           
  7.         final ExecutorService exec = Executors.newFixedThreadPool(1);  
  8.           
  9.         Callable<String> call = new Callable<String>() {  
  10.             public String call() throws Exception {  
  11.                 //開始執行耗時操作  
  12.                 Thread.sleep(1000 * 5);  
  13.                 return "線程執行完成.";  
  14.             }  
  15.         };  
  16.           
  17.         try {  
  18.             Future<String> future = exec.submit(call);  
  19.             String obj = future.get(1000 * 1, TimeUnit.MILLISECONDS); //任務處理超時時間設爲 1 秒  
  20.             System.out.println("任務成功返回:" + obj);  
  21.         } catch (TimeoutException ex) {  
  22.             System.out.println("處理超時啦....");  
  23.             ex.printStackTrace();  
  24.         } catch (Exception e) {  
  25.             System.out.println("處理失敗.");  
  26.             e.printStackTrace();  
  27.         }  
  28.         // 關閉線程池  
  29.         exec.shutdown();  
  30.     }  
  31. }  
注意,以上代碼需要 1.5 以上的 jdk 纔可編譯。 
執行後可以發現拋出了 TimeoutException ,打印出了"處理超時啦...." 的文字,在此處可進行超時後的處理。

發佈了133 篇原創文章 · 獲贊 228 · 訪問量 430萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章