线程回调方式我们已经在使用回调和线程处理一个耗时响应过程文中进行了讲述但是有些情况下用户希望在指定时间内返回一个结果免得无休止的等待下去这时我们需要使用限时线程回调方式它在原有线程回调的基础上加上了一个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; } }}
执行效果如下