代码
原理是新建一个Callable线程(call方法可以返回对象),用FutureTask封装后,通过future对象的get方法来设定超时限制。如果超时,则future.cancel(true)取消执行。
重写Callable的call方法,在call方法中调用需要超时设置的接口(在这里是listQuery())。Callable线程我们放到线程池里执行。
import java.util.*;
import java.util.concurrent.*;
public class Main {
public static List<String> listQuery() throws Exception {
Thread.sleep(2200); // 模拟listQuery接口调用时间
List<String> res = new ArrayList<>();
res.add("不超时");
return res;
}
public static void main(String[] args) {
String keyword = "超时"; // 超时则res存"超时",不超时说明正常执行listQuery接口,res会存"不超时"
List<String> res = new ArrayList<>();
res.add(keyword);
ExecutorService executorService = new ThreadPoolExecutor(1, 1, 0L,
TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
FutureTask<List<String>> future = new FutureTask<> (
new Callable<List<String>>() {
public List<String> call() throws Exception {
List<String> stringList = listQuery();
return stringList;
}
});
// 加载future
executorService.execute(future);
try {
res = future.get(2, TimeUnit.SECONDS);
} catch (Exception e) {
e.printStackTrace(); // 超时报个错
future.cancel(Boolean.TRUE);
} finally {
executorService.shutdown(); // 关闭线程池
}
System.out.println(res);
}
}