線程回調方式我們已經在使用回調和線程處理一個耗時響應過程文中進行了講述但是有些情況下用戶希望在指定時間內返回一個結果免得無休止的等待下去這時我們需要使用限時線程回調方式它在原有線程回調的基礎上加上了一個Timer以計算消耗的時間如果時間期限到了任務還沒有執行完的話即中斷線程示例代碼如下
package comsitinspring;
import javaawteventActionEvent;
import javaawteventActionListener;
import javaxswingTimer;
/** *//**
* 定時回調線程類
*
* @author sitinspring()
*
* @date
*/
public class TimedCallBackThread implements Runnable {
// 一秒的毫秒數常量
private final static int ONE_SECOND = ;
// 限制時間以秒為單位
private final int waitTime;
// 已經流逝的時間
private int passedTime;
private Timer timer;
private Thread thread;
private MvcTcModel model;
private MvcTcView view;
public TimedCallBackThread(MvcTcModel model MvcTcView view int waitTime)
{
thismodel = model;
thisview = view;
thiswaitTime = waitTime;
thispassedTime = ;
// 創建並啟動定時器
timer = new Timer(ONE_SECOND new ActionListener() {
public void actionPerformed(ActionEvent evt) {
timeListener();
}
});
timerstart();
// 創建並啟動線程來完成任務
thread = new Thread(this);
threadstart();
}
private void timeListener() {
passedTime++;
// 動態顯示狀態
int modSeed = passedTime % ;
if (modSeed == ) {
viewgetLabel()setText(響應中);
} else if (modSeed == ) {
viewgetLabel()setText(響應中);
} else if (modSeed == ) {
viewgetLabel()setText(響應中);
}
// 如果流逝時間大於規定時間則中斷線程
if (passedTime > waitTime) {
passedTime = waitTime;
threadinterrupt();
}
}
public void run() {
while (passedTime < waitTime) {
try {
Threadsleep();// 模擬一個耗時相應過程
timerstop();// 任務完成停止Timer
viewgetLabel()setText(modelgetText());
} catch (InterruptedException ex) {
timerstop();// 線程中斷停止Timer
viewgetLabel()setText(在指定時間內未響應);
} catch (Exception ex) {
exprintStackTrace();
}
return;
}
}
}
執行效果如下
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27315.html