服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 高级技术 > 多线程 > 查看文档

java中限时线程回调方式的实现

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

  执行效果如下:

  

  

扫描关注微信公众号