用来执行的线程拥有自己的执行策略,即使任务不响应中断,限时运行的方法仍然返回到它的调用者。在开始任务线程之后,timeRun会在新创建的线程中执行一个限时的join方法。
在调用线程中运行任务,并在调度中安排了一个取消任务,由这个任务在给定时间间隔后中断它。
private static final ScheduleExecutorServicecancelExec=……..;
public static void timedRun(final Runnable r,longtimeout,TimeUnit unit)
throws InterruptedExcepion{
classRethrowableTask implements Runnable{
private volatile Throwable t;
public void run(){
try {r.run();}
catch(Throwable t) {this.t=t;}
}
void rethrow(){
if (t!=null) throw launderThrowable(t);
}
}
RethrowableTask task=new RethrowableTask();
finalThread taskThread=new Thread(task);
taskThread.start();
cancelExec.schedule(newRunnable(){public voidrun(){taskThread.interrupt();}},timeout,unit);
taskThread.join(unit.toMillis(timeout));
task.rethrow();
}