----------Callable&Future--------- Callable 和Runnable接口的区别: Callable 定义的方法是call,Runnable定义的方法是run。 Callable的call方法可以有返回值,而Rannable的run方法不能有返回值。 Callable的call方法可以抛出异常,而Rannable的run方法不能抛出异常 Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明 Future<?> 形式类型、并返回 null 作为底层任务的结果。 FutureTask 类是 Future 的一个实现,Future 可实现 Runnable,所以可通过 Executor 来执行。FutureTask 属于代理类 ,负责启动Callable对象,并且可以通过它来获得Callable的返回信息。 FutureTask<String> future = new FutureTask<String>( new Callable<String>() { public String call() { return searcher.search(target); } }); executor.execute(future); ---------------- public class CallableAndFuture { public static void main(String[] args) { ExecutorService threadPool = Executors.newSingleThreadExecutor(); Future<String> future = threadPool.submit( new Callable<String>() { public String call() throws Exception { Thread.sleep(2000); return "hello"; }; } ); System.out.println("等待结果"); try { System.out.println("拿到结果:" + future.get()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } //提交一组任务用CompletionService ExecutorService threadPool2 = Executors.newFixedThreadPool(14); CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>(threadPool2); //处理返回的feinull的每个结果。 //void solve(Executor e, Collection<Callable<Result>> solvers)throws InterruptedException, ExecutionException { // CompletionService<Result> ecs = new ExecutorCompletionService<Result>(e); // for (Callable<Result> s : solvers) // ecs.submit(s); // int n = solvers.size(); // for (int i = 0; i < n; ++i) { // Result r = ecs.take().get(); // if (r != null) // use(r); // } // } //使用第一个返回的非null的且不抛异常的结果,并在接受到结果之后就取消其他任务。 // void solve(Executor e, Collection<Callable<Result>> solvers) throws InterruptedException { // CompletionService<Result> ecs = new ExecutorCompletionService<Result>(e); // int n = solvers.size(); // List<Future<Result>> futures = new ArrayList<Future<Result>>(n); // Result result = null; // try { // for (Callable<Result> s : solvers) // futures.add(ecs.submit(s)); // for (int i = 0; i < n; ++i) { // try { // Result r = ecs.take().get(); // if (r != null) { // result = r; // break; // } // } catch(ExecutionException ignore) {} // } // } // finally { // for (Future<Result> f : futures) // f.cancel(true); // } // // if (result != null) // use(result); // } for(int i=1;i<=10;i++){ final int seq = i; completionService.submit(new Callable<Integer>() { @Override public Integer call() throws Exception { Thread.sleep(new Random().nextInt(5000)); return seq; } }); }
|