如何在超时后取消任务?
我有一些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 public
) ExecutorService
执行任务)。
超时后如何使用未来和取消任务:
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