那麼能不能設置一段代碼執行的超時時間呢?如果處理超時就忽略該錯誤繼續向下執行。
可是在網上搜了大半天,找到的都是無用的代碼,根本不能用。
查了大量資料後發現,java早已經給我們提供瞭解決方案。jdk1.5自帶的併發庫中Future類就能滿足這個需求。Future類中重要方法包括get()和cancel()。get()獲取數據對象,如果數據沒有加載,就會阻塞直到取到數據,而 cancel()是取消數據加載。另外一個get(timeout)操作,表示如果在timeout時間內沒有取到就失敗返回,而不再阻塞。
到這裏,此問題就迎刃而解了。廢話不多說,直接上代碼:
-
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; - public class ThreadTest {
- public static void main(String[] args) throws InterruptedException,
- ExecutionException {
- final ExecutorService exec = Executors.newFixedThreadPool(1);
- Callable<String> call = new Callable<String>() {
- public String call() throws Exception {
- //開始執行耗時操作
- Thread.sleep(1000 * 5);
- return "線程執行完成.";
- }
- };
- try {
- Future<String> future = exec.submit(call);
- String obj = future.get(1000 * 1, TimeUnit.MILLISECONDS); //任務處理超時時間設爲 1 秒
- System.out.println("任務成功返回:" + obj);
- } catch (TimeoutException ex) {
- System.out.println("處理超時啦....");
- ex.printStackTrace();
- } catch (Exception e) {
- System.out.println("處理失敗.");
- e.printStackTrace();
- }
- // 關閉線程池
- exec.shutdown();
- }
- }
執行後可以發現拋出了 TimeoutException ,打印出了"處理超時啦...." 的文字,在此處可進行超時後的處理。