原理是新建一个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); } }