java中超时程序的实现
在java中可以使用ExecutorService搭配Futrue来实现超时程序,FutureTask实现了Future接口,直接上代码:
package com.test;
?
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
?
public class FutureTest {
?
public static void main(String[] a){
ExecutorService service = Executors.newSingleThreadExecutor();
FutureTask<String> task = new FutureTask<String>(new Callable<String>() {
@Override
public String call() throws Exception {
try {
Thread.sleep(6000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("hello");
return null;
}
});
service.submit(task);
try {
task.get(5000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TimeoutException e) {
System.out.println("over");
}finally{
service.shutdown();
}
}
}
?
FutureTask的get(long timeout,TimeUnit unit)方法的作用是,如果在规定的timeout时间内future中的任务如果还没有执行完成,则此时抛出TimeoutException,因为我在call方法中设定使当前任务所在线程停止6秒,当停止到第5秒的时候任务已经超时,所以就进入了超时异常程序处理块,所以此时会打印over,但由于线程调度器中发现还有线程没有终结,所以要等到线程调度器中所有线程执行完成之后才能shutdown,所以在第6秒的时候会打印hello,当所有线程都执行完后,程序就退出了。
?
?
?