1、Callable<V>接口

Runnable接口

public interface Runnable {  public abstract void run();
} 

Callable

public interface Callable<V> {   V   call()   throws Exception;
}   

runnable接口 Callable接口 都可以被ThreadPoolExecutor或ScheduledThreadPoolExecutor执行,两者实现了ExcutorService接口

ExecutorService接口

<T> Future<T> submit(Callable<T> task);
<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);

2、Future<V> 

获得异步计算结果,说白了就是对具体的Runnable或者Callable对象任务执行的结果进行获取(get()),取消(cancel()),判断是否完成等操作。

public interface Future<V> {    //如果任务没开始,cancle()将会返回true  //如果任务已经启动,执行cancle(true)将以中断执行此任务线程的方式来试图阻止任务,成功返沪true   //如果任务已经启动,执行cancle(false)将不会对执行线程产生影响,此时返回falseboolean cancel(boolean mayInterruptIfRunning);    //如果任务完成前被取消,返回trueboolean isCancelled();    //如果任务结束,无论是正常结束或是中途取消还是发生异常,都会trueboolean isDone();    //获取异步执行结果,如果没有结果可用,此方法会阻塞直到异步计算完成。V get() throws InterruptedException, ExecutionException;    //获取异步执行结果,如果没有结果可用,此方法会阻塞,   //但是会有时间限制,如果阻塞时间超过设定的timeout时间,该方法将抛出异常。V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
}  

3、FutureTask类

public class FutureTask<V> implements RunnableFuture<V> {  

其中

public interface RunnableFuture<V> extends Runnable, Future<V> {  void run();
}  

构造方法:

public interface RunnableFuture<V> extends Runnable, Future<V> {  void run();
}  

使用场景:

1、使用Callable+Future获取执行结果

package com.zejian.Executor;
import java.util.concurrent.Callable;
/** * @author zejian * @time 2016年3月15日 下午2:02:42 * @decrition Callable接口实例 */
public class CallableDemo implements Callable<Integer> {  private int sum;  @Override  public Integer call() throws Exception {  System.out.println("Callable子线程开始计算啦!");  Thread.sleep(2000);  for(int i=0 ;i<5000;i++){  sum=sum+i;  }  System.out.println("Callable子线程计算结束!");  return sum;  }
}  

package com.zejian.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/** * @author zejian * @time 2016年3月15日 下午2:05:43 * @decrition callable执行测试类 */
public class CallableTest {  public static void main(String[] args) {  //创建线程池  ExecutorService es = Executors.newSingleThreadExecutor();  //创建Callable对象任务  CallableDemo calTask=new CallableDemo();  //提交任务并获取执行结果  Future<Integer> future =es.submit(calTask);  //关闭线程池
        es.shutdown();  try {  Thread.sleep(2000);  System.out.println("主线程在执行其他任务");  if(future.get()!=null){  //输出获取到的结果  System.out.println("future.get()-->"+future.get());  }else{  //输出获取到的结果  System.out.println("future.get()未获取到结果");  }  } catch (Exception e) {  e.printStackTrace();  }  System.out.println("主线程在执行完成");  }
} 

执行结果:

Callable子线程开始计算啦!
主线程在执行其他任务
Callable子线程计算结束!
future.get()-->12497500
主线程在在执行完成

2、使用Callable+FutureTask获取执行结果

package com.zejian.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
/** * @author zejian * @time 2016年3月15日 下午2:05:43 * @decrition callable执行测试类 */
public class CallableTest {  public static void main(String[] args) {            //创建线程池  ExecutorService es = Executors.newSingleThreadExecutor();  //创建Callable对象任务  CallableDemo calTask=new CallableDemo();  //创建FutureTask  FutureTask<Integer> futureTask=new FutureTask<>(calTask);  //执行任务
        es.submit(futureTask);  //关闭线程池
        es.shutdown();  try {  Thread.sleep(2000);  System.out.println("主线程在执行其他任务");  if(futureTask.get()!=null){  //输出获取到的结果  System.out.println("futureTask.get()-->"+futureTask.get());  }else{  //输出获取到的结果  System.out.println("futureTask.get()未获取到结果");  }  } catch (Exception e) {  e.printStackTrace();  }  System.out.println("主线程在执行完成");  }
}  

结果:

Callable子线程开始计算啦!
主线程在执行其他任务
Callable子线程计算结束!
futureTask.get()-->12497500
主线程在执行完成

转载于:https://www.cnblogs.com/L-a-u-r-a/p/8570080.html

Callable、Future、FutureTask浅析相关推荐

  1. Java并发编程举例Runnable, Callable, Future, FutureTask, CompletionService

    import java.util.concurrent.*;/*** Created by chenh on 2017/3/23.*/ public class ConcurrentDemo {// ...

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

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

  3. 如何使用Callable和FutureTask

    介绍 从Java 1.5开始,在java.util.concurrent下有了新的对象集. 该程序包具有许多不同的类,包括线程队列. 当我用Java 1.2编程时,我本可以使用那些! 当我开始看这些新 ...

  4. java Future FutureTask 并发操作

    2019独角兽企业重金招聘Python工程师标准>>> 1.1 综述 创建线程有两种方式:extends Thread || inplements Runable,但是这两种方式都有 ...

  5. java回调原理,以及Callable和FutureTask通过回调机制创建可监控的线程

    回调的概念会JS的人应该都能理解. 回调分异步回调,同步回调.但是同步回调其实没什么意义.都同步了,那么直接等那边执行完了,这边再执行就可以了,没必要通过回调.我们说的回调主要是讲异步回调.用于两个线 ...

  6. Java创建线程的三种方式,以前只知道两种,现在添加一种Callable与FutureTask创建的方式

    一共有以下三种方式: 1.继承Thread 2.实现Runnable 3.实现Callable,并FutureTask包装 线程启动方式均是使用start()方法 先阐述优缺点: 1和2,3: 2,3 ...

  7. 【转载】Callable、FutureTask中阻塞超时返回的坑点

    本文转载自:http://www.cnblogs.com/starcrm/p/5010863.html 案例1: package com.net.thread.future;import java.u ...

  8. Java线程池 / Executor / Callable / Future

    为什么需要线程池? 每次都要new一个thread,开销大,性能差:不能统一管理:功能少(没有定时执行.中断等). 使用线程池的好处是,可重用,可管理. Executor 4种线程池 // 可缓存线程 ...

  9. callable线程池示例_Java Callable Future示例

    callable线程池示例 Java Callable and Future are used a lot in multithreaded programming. In last few post ...

最新文章

  1. C# Aop简单扫盲及ORM实体类属性拦截示例
  2. 用神经网络分类响尾蛇和牛蛙
  3. 一步步编写操作系统 09 写个mbr
  4. oracle中保留2位小数的写法
  5. 武汉三首,记录备忘,写的不好,以后再改
  6. pandas 处理 csv
  7. SpringApplication.run方法分析
  8. FAT文件系统“格式化”的恢复方法
  9. 判断一个数字是否为素数 C++实现
  10. 【尚硅谷】Gradle教程入门到进阶(从gradle安装到项目实战)笔记
  11. C语言数据结构之一元多项式的求导
  12. java读取图片 去除alpha_java – 从图像中剥离Alpha通道
  13. B站banner图片随鼠标移动虚化效果摸索
  14. android三星s8底部菜单,【Android】三星Galaxy S8及S8+的屏幕适配
  15. 5不触发系统键盘_智能化子系统红外周界报警的基础知识介绍!
  16. elasticsearch for windows
  17. JS的严格模式和标准模式
  18. Get Request
  19. 微积分 重点难点记录
  20. 靶机渗透练习43-Lord Of The Root

热门文章

  1. 最常用最好记Linux命令
  2. 时间类(时间戳的各种转换成)
  3. Object.wait()与Object.notify()的用法
  4. 从性能方面谈系统设计
  5. Lamp的搭建--centos6.5下安装mysql
  6. search strategies
  7. 三个免费图片网站:特别适合场景图
  8. 打基础和俄罗斯方块的关系
  9. 【转】跨DLLnew delete问题
  10. 面试官:前端跨页面通信,你知道哪些方法?