如何在超时后取消任务?

我有一些Task执行可以挂起的I / O阻塞操作(从URL获取文件)

 task = new Task<List>() { @Override protected List call() { List services = new ArrayList(); try { services = WSDLService.createService(wsdlURL).getOperations(); } catch (Exception ex) { LOG.log(Level.WARNING, "Can't reach {0}", wsdlURL); } return services; } }; } 

createService方法可以永远等待而不会抛出任何Exception 。 (我使用Main类中定义的全局( static publicExecutorService执行任务)。

超时后如何使用未来和取消任务:

 import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class Test { public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); Task t = new Task(); Future future = executor.submit(t); try { System.out.println("Started.."); System.out.println(future.get(5, TimeUnit.SECONDS)); // throws // TimeoutException System.out.println("Finished!"); } catch (TimeoutException e) { future.cancel(true); System.out.println("Terminated!"); } } } class Task implements Callable { @Override public String call() throws Exception { for (int i = 0; i < 1000; i++) { Thread.sleep(1000); System.out.println("task running!"); } return "Ready!"; } } 

您正在使用ExecutorService ,因此您可以在提交任务后执行此操作:

 ExecutorService executor = // ... Future future = executor.submit(task); future.get(5, TimeUnit.MINUTES); // timeout 5 mins