实现描述:使用一个守护线程作为计时器,并且在计时结束时抛出一个未检测异常。
守护线程类
/** * 本线程设置了一个超时时间 * 该线程开始运行后,经过指定超时时间, * 该线程会抛出一个未检查异常通知调用该线程的程序超时 * 在超时结束前可以调用该类的cancel方法取消计时 */ public class TimeoutThread extends Thread{ // 计时器超时时间 private long timeout; // 计时是否被取消 private boolean isCanceled = false; // 当计时器超时时抛出的异常 private TimeoutException timeoutException; public TimeoutThread(long timeout,TimeoutException timeoutErr) { super(); this.timeout = timeout; this.timeoutException = timeoutErr; //设置本线程为守护线程 this.setDaemon(true); } /** * 取消计时 */ public synchronized void cancel() { isCanceled = true; } /** * 启动超时计时器 */ public void run() { try { Thread.sleep(timeout); if(!isCanceled) throw timeoutException; } catch (InterruptedException e) { e.printStackTrace(); } } }
抛出异常类
该类继承了RuntimeException,原因是run方法不能抛出已检测异常。
public class TimeoutException extends RuntimeException { /** * 序列化号 */ private static final long serialVersionUID = -8078853655388692688L; public TimeoutException(String errMessage) { super(errMessage); } }
// 初始化超时类 TimeoutThread t = new TimeoutThread(5000, new TimeoutException("超时")); try { t.start(); .....要检测超时的程序段.... t.cancel(); } catch (TimeoutException e) { ...对超时的处理... }
本方法的使用可以实现线程自己管理超时,并且可以管理某一段代码超时时,可以在方法内部给出处理办法。
但是需要注意的是:本方法的超时时间并不是当前线程的运行时间,而是计时器开始计时起系统运行的时间。
java中有自带API可以实现超时线程控制:Callable, Future