线程回调方式我们已经在"使用回调和线程处理一个耗时响应过程"文中进行了讲述,但是有些情况下用户希望在指定时间内返回一个结果,免得无休止的等待下去。这时我们需要使用"限时线程回调方式",它在原有线程回调的基础上加上了一个timer以计算消耗的时间,如果时间期限到了任务还没有执行完的话即中断线程,示例代码如下:
package com.sitinspring;
import java.awt.event.actionevent;
import java.awt.event.actionlistener;
import javax.swing.timer;
/** *//**
* 定时回调线程类
*
* @author sitinspring(junglesong@gmail.com)
*
* @date 2007-11-6
*/
public class timedcallbackthread implements runnable {
// 一秒的毫秒数常量
private final static int one_second = 1000;
// 限制时间,以秒为单位
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) {
this.model = model;
this.view = view;
this.waittime = waittime;
this.passedtime = 0;
// 创建并启动定时器
timer = new timer(one_second, new actionlistener() {
public void actionperformed(actionevent evt) {
timelistener();
}
});
timer.start();
// 创建并启动线程来完成任务
thread = new thread(this);
thread.start();
}
private void timelistener() {
passedtime++;
// 动态显示状态
int modseed = passedtime % 3;
if (modseed == 0) {
view.getlabel2().settext("响应中");
} else if (modseed == 1) {
view.getlabel2().settext("响应中..");
} else if (modseed == 2) {
view.getlabel2().settext("响应中.");
}
// 如果流逝时间大于规定时间则中断线程
if (passedtime > waittime) {
passedtime = waittime;
thread.interrupt();
}
}
public void run() {
while (passedtime < waittime) {
try {
thread.sleep(10000);// 模拟一个耗时相应过程
timer.stop();// 任务完成,停止timer
view.getlabel2().settext(model.gettext2());
} catch (interruptedexception ex) {
timer.stop();// 线程中断,停止timer
view.getlabel2().settext("在指定时间内未响应");
} catch (exception ex) {
ex.printstacktrace();
}
return;
}
}
} |
执行效果如下: