java 1.5以上的Future类可以执行超时处理。
jdk1.5自带的并发库中Future类中重要方法包括get()和cancel(),get()获取数据对象,如果数据没有加载,就会阻塞直到取到数据,而 cancel()是取消数据加载。另外一个get(timeout)操作,表示如果在timeout时间内没有取到就失败返回,而不再阻塞。
代码如下:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import com.sun.corba.se.impl.orbutil.closure.Future;
import com.sun.corba.se.impl.orbutil.threadpool.TimeoutException;
public class ThreadTest {
public static void main(String[] args) throws InterruptedException,
ExecutionException {
final ExecutorService exec = Executors.newFixedThreadPool(1);
Callablecall = new Callable () {
public String call() throws Exception {
//开始执行耗时操作
Thread.sleep(1000 * 5);
return "线程执行完成.";
}
};
try {
Futurefuture = exec.submit(call);
String obj = future.get(1000 * 1, TimeUnit.MILLISECONDS); //任务处理超时时间设为 1 秒
System.out.println("任务成功返回:" + obj);
} catch (TimeoutException ex) {
System.out.println("处理超时啦....");
ex.printStackTrace();
} catch (Exception e) {
System.out.println("处理失败.");
e.printStackTrace();
}
// 关闭线程池
exec.shutdown();
}
}
写一个监听线程就ok啦,执行方法前启动一个线程,20s后去看那个方法有没有结束(可以搞个标记用于判断)
这个问题没有太好的安全解决办法。
你可以把方法封装在线程里,
然后外部用一个定时线程延时20S苏醒看看那个工作线程执行结束了没有,
如果没有,那么就设置工作线程的结束标志,等待工作线程结束。
在工作线程内部加上判断结束标志的代码,一旦为真马上退出本函数。
可以在方法里面加定时器, 从进方法开始。
schedule(TimerTask task, long delay, long period)
TimerTask :定时任务,可以在里面写一个中断或者返回。
具体逻辑:
mytask{
设置定时任务(myTimerTask),20s即20000ms后执行“中断”;
这里是要执行的该任务的内容;
执行任务完成后取消定时任务并正常返回;
}
myTimerTask{
执行中断操作;
写入错误日志;
}
搞个线程试试