本文介绍了超时后如何取消任务?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一些 Task 执行可能会挂起的I / O阻止操作(从 URL 获取文件)
I have some Task execute a I/O blocking operation that can hang (fetching a file from an URL)
task = new Task<List<WSDLOperation>>() { @Override protected List<WSDLOperation> call() { List<WSDLOperation> 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类中定义的全局(静态公共) ExecutorService 执行任务)。
The method createService can wait forever without throwing any Exception. (I execute the task using a global (static public)ExecutorService defined in Main class).
推荐答案如何在超时后使用Future和取消任务:
How use future and cancel task after timeout:
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<String> 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<String> { @Override public String call() throws Exception { for (int i = 0; i < 1000; i++) { Thread.sleep(1000); System.out.println("task running!"); } return "Ready!"; } }更多推荐
超时后如何取消任务?
发布评论