1.简介

Callable是一个接口,与Runnable类似,包含一个必须实现的call方法,可以启动为让另一个线程来执行,执行Callable可以得到一个Future对象 该对象可以监听Callable的执行结果 也可以取消该任务的执行

2.案例

package org.lkl.thead.foo;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; public class CallableAndFuture {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService threadPool = Executors.newSingleThreadExecutor() ;
Future<String> future = threadPool.submit(new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println("call method");
Thread.sleep() ;
return "liaokailin";
}
}) ;
System.out.println(" future.isCancelled():"+ future.isCancelled()); ;
while(!future.isDone()){
System.out.println("---等待结果---");
}
// future.cancel(true) ;
System.out.println(future.get() );;
}
}

通过threadPool.submit可以返回一个Future对象 ,通过该对象的 future.isDone 表示Callable中的任务是否执行完成  true表示完成

future.cancle(true) 可以取消Callable中的任务(call)

future.get() 得到的是Callable中call方法的返回值.

注意 代码执行到future.get()的时候会等待Callable中的call方法执行 等待执行结束以后get()方法才会执行完成 ,否则一直在等待call的执行   也可以通过 future.get(timeout, unit)

方法来设置等待几秒以后获取call的返回值 如果没有获取到结果则返回异常.

3. CompletionService

通过CompletionService可以处理一组Callable任务 ,通过其take方法可以获得Future对象

    ExecutorService threadPool =  Executors.newFixedThreadPool() ;
CompletionService<Integer> service = new ExecutorCompletionService<Integer>(threadPool) ; for(int i = ;i<=;i++){
final int flag = i ;
service.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
Thread.sleep(new Random().nextInt()) ;
return flag;
}
}) ;
} for(int i = ;i<=;i++){
Future<Integer> future = service.take() ;
System.out.println(future.get() ); }

结果:


  执行的结果是无序的 那么说明CompletionService获得Callable的结果是 看哪个Callable先执行完成则先获得其返回的结果

如果将上面的 ExecutorService threadPool =  Executors.newFixedThreadPool(10) ; 方法换成:

ExecutorService threadPool =  Executors.newSingleThreadExecutor() ;

则执行的结果是从1-10有序的

那是因为当前线程池中只有一个线程  要等待for循环的第一次执行完才会去执行第二次的for循环.

多线程08-Callable和Future的更多相关文章

  1. Java多线程知识-Callable和Future

    Callable和Future出现的原因 创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需 ...

  2. Java多线程编程:Callable、Future和FutureTask浅析(多线程编程之四)

    java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)java多线程同步以及线程间通信详解&消费者生产者模式&死锁& ...

  3. Java多线程系列--“JUC线程池”06之 Callable和Future

    概要 本章介绍线程池中的Callable和Future.Callable 和 Future 简介示例和源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.co ...

  4. Java多线程21:多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask

    CyclicBarrier 接着讲多线程下的其他组件,第一个要讲的就是CyclicBarrier.CyclicBarrier从字面理解是指循环屏障,它可以协同多个线程,让多个线程在这个屏障前等待,直到 ...

  5. java多线程系列(七)---Callable、Future和FutureTask

    Callable.Future和FutureTask 前言:如有不正确的地方,还望指正. 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量 ...

  6. java 多线程 33: 多线程组件之 Callable、Future和FutureTask

    Callable Callable和rRunnable差不多,两者都是为那些其实例可能被另一个线程执行的类而设计的,最主要的差别在于Runnable不会返回线程运算结果,Callable可以(假如线程 ...

  7. Java线程和多线程(十三)——Callable,Future,FutureTask

    在Java多线程之中,Callable和Future的使用时非常广泛的.在之前的文章中,我们了解了关于Java线程池基础的一些内容,知道如何提交Runnable的任务.但是,Runnable的任务是无 ...

  8. Java多线程 - Callable和Future

    已知的创建多线程的方法有继承Tread类和实现Runnable方法.此外Java还提供了Callable接口,Callable接口也提供了一个call()方法来做为线程执行体.但是call()方法与r ...

  9. Android进阶——多线程系列之Thread、Runnable、Callable、Future、FutureTask

    多线程一直是初学者最抵触的东西,如果你想进阶的话,那必须闯过这道难关,特别是多线程中Thread.Runnable.Callable.Future.FutureTask这几个类往往是初学者容易搞混的. ...

  10. ExecutorService、Callable、Future实现有返回结果的多线程原理解析

    原创/朱季谦 在并发多线程场景下,存在需要获取各线程的异步执行结果,这时,就可以通过ExecutorService线程池结合Callable.Future来实现. 我们先来写一个简单的例子-- pub ...

随机推荐

  1. Web前端开发人员和设计师必读文章推荐

    推荐一个很好的学习资源: Web前端开发人员和设计师必读文章推荐[系列一] Web前端开发人员和设计师必读文章推荐[系列二] Web前端开发人员和设计师必读文章推荐[系列三] Web前端开发人员和设计 ...

  2. Ubuntu 14.04 升级后 VPN 无法连接的问题

    如果不知道怎么配置 VPN Server(IPSEC + L2TP),可以看这篇文章(英文). 问题表现: 将 Ubuntu 12.04 通过自动更新 —— do-release-upgrade —— ...

  3. 【转】android蓝牙开发---与蓝牙模块进行通信--不错

    原文网址:http://www.cnblogs.com/wenjiang/p/3200138.html 近半个月来一直在搞android蓝牙这方面,主要是项目需要与蓝牙模块进行通信.开头的进展很顺利, ...

  4. Yarn应用程序运行流程剖析

    Yarn(Yet Another Resource Negotiator)是一个Hadoop集群资源管理系统,Hadoop2时被引入,旨在提高MapReduce的性能,但YARN已足够通用,使得它可以 ...

  5. 开放计算平台——数据仓库(Hive)权限控制

    平台数据仓库使用Hive进行构建,通过调研决定使用“SQL Standards Based Authorization in HiveServer2”对用户提交的SQL进行权限控制,也可根据实际情况选 ...

  6. 【日语】secret base

    君(きみ)と夏(なつ)の终(お)わり 将来(しょうらい)の梦(ゆめ)Kimi to natsu no owari shourai no yume大(おお)きな希望(きぼう) 忘(わす)れないOoki ...

  7. Letter Combinations of a Phone Number——LeetCode

    Given a digit string, return all possible letter combinations that the number could represent. A map ...

  8. 查看Wii的系统版本信息

    Wii的系统版本信息在系统设置界面就能看到: Step1:主界面 > Wii Options Step2:选择右边的Wii Settings Step3:如下图所示,当前主机的系统版本是4.2U ...

  9. Spring 4.0 StandaloneMockMvcBuilder java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig 问题解决

    standaloneSetup(clrr). build(); 执行第二行 build() 时,出现下面的错误提示. java.lang.NoClassDefFoundError: javax/ser ...

  10. Selenium webdriver 元素操作

    本来这些东西网上一搜一大堆,但是本着收集的精神,整理一份放着吧!哈!哈!哈! 1. 输入框(text field or textarea) WebElement element = driver.fi ...