Java程序運行超時后退出或進行其他操作的實現(xiàn)[轉(zhuǎn)]
Posted on 2013-09-24 09:25 帥子 閱讀(1566) 評論(0) 編輯 收藏 所屬分類: j2ee技術(shù)專區(qū)對于開發(fā)軟件 Eclipse ,在程序執(zhí)行超時后,可以點擊 Terminate 按鈕強制退出。
那么,我們可不可以通過程序設(shè)置一定的時間,當(dāng)程序運行超過該時長后自行終止或者進行其他操作呢?
查了大量資料后發(fā)現(xiàn),F(xiàn)uture類就能滿足這個需求。
Future類中重要方法包括get()和cancel()。
get()獲取數(shù)據(jù)對象,如果數(shù)據(jù)沒有加載,就會阻塞直到取到數(shù)據(jù),而 cancel()是取消數(shù)據(jù)加載。
另外一個get(timeout)操作,表示如果在timeout時間內(nèi)沒有取到就失敗返回,而不再阻塞。
通過這些方法即可實現(xiàn)我們要求。
Java 代碼示例:
final ExecutorService exec = Executors.newFixedThreadPool(1);
Callable
public String call() throws Exception {
// 放入耗時操作代碼塊
int cash = 300;
String name = "張三";
System.out.println(name + "現(xiàn)在有" + 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();
}
//耗時代碼塊結(jié)束
Thread.sleep(1000 * 5);
return "線程執(zhí)行完成";
}
};
try {
Future
String obj = future.get(1000 * 1, TimeUnit.MILLISECONDS); // 任務(wù)處理超時時間設(shè)為1 秒
System.out.println("任務(wù)成功返回:" + obj);
} catch (TimeoutException ex) {
System.out.println("處理超時啦....");
System.exit(0);
} catch (Exception e) {
System.out.println("處理失敗.");
e.printStackTrace();
}
exec.shutdown(); // 關(guān)閉線程池
將耗時的代碼塊放入標(biāo)注的地方后,即可滿足要求。
System.out.println("處理失敗.");
e.printStackTrace();
System.out.println("處理失敗.");
e.printStackTrace();
在該示例程序中,當(dāng)運行超時后,執(zhí)行的是退出程序的操作。
也可以根據(jù)需要放入其他代碼進行相關(guān)操作。
例如可以設(shè)置當(dāng)處理超時時就忽略 該錯誤繼續(xù)向下執(zhí)行