對于開發軟件 Eclipse ,在程序執行超時后,可以點擊 Terminate 按鈕強制退出。
那么,我們可不可以通過程序設置一定的時間,當程序運行超過該時長后自行終止或者進行其他操作呢?
查了大量資料后發現,Future類就能滿足這個需求。
Future類中重要方法包括get()和cancel()。
get()獲取數據對象,如果數據沒有加載,就會阻塞直到取到數據,而 cancel()是取消數據加載。
另外一個get(timeout)操作,表示如果在timeout時間內沒有取到就失敗返回,而不再阻塞。
通過這些方法即可實現我們要求。
Java 代碼示例:
final ExecutorService exec = Executors.newFixedThreadPool(1);
Callable call = new Callable() {
public String call() throws Exception {
// 放入耗時操作代碼塊
int cash = 300;
String name = "張三";
System.out.println(name + "現在有" + cash + "元存款");
User u = new User(name, cash);
String[] arr = { "線程A", "線程B", "線程C", "線程D", "線程E", "線程F",
"線程G", "線程H", "線程I", "線程J" };
for (int i = 0; i < 10; i++) {
MyThread th = new MyThread(arr[i], u,
(int) (Math.random() * 1000 - 500));
th.start();
}
//耗時代碼塊結束
Thread.sleep(1000 * 5);
return "線程執行完成";
}
};
try {
Future future = exec.submit(call);
String obj = future.get(1000 * 1, TimeUnit.MILLISECONDS); // 任務處理超時時間設為1 秒
System.out.println("任務成功返回:" + obj);
} catch (TimeoutException ex) {
System.out.println("處理超時啦....");
System.exit(0);
} catch (Exception e) {
System.out.println("處理失敗.");
e.printStackTrace();
}
exec.shutdown(); // 關閉線程池
將耗時的代碼塊放入標注的地方后,即可滿足要求。
System.out.println("處理失敗.");
e.printStackTrace();
System.out.println("處理失敗.");
e.printStackTrace();
在該示例程序中,當運行超時后,執行的是退出程序的操作。
也可以根據需要放入其他代碼進行相關操作。
例如可以設置當處理超時時就忽略 該錯誤繼續向下執行