4.Future和 FutureTask

4.1 Future是Callable的返回结果。

它有三个功能

1.判断任务是否完成

2.能够中断任务

3.能够获取任务返回结果

4.2 FutureTask

FutureTask 实现了RunnableFuture接口,RunnableFuture这个接口又继承自Runnable和Future

因此FutureTask 既可以作为Runnable被线程执行(通过包装Callable对象),又可以作为Future得到Callable返回值。

public FutureTask(Callable callable) {

if (callable == null)

throw new NullPointerException();

this.callable = callable;

this.state = NEW; // ensure visibility of callable

}

public FutureTask(Runnable runnable, V result) {

this.callable = Executors.callable(runnable, result);

this.state = NEW; // ensure visibility of callable

}

两个构造方法,FutureTask接口是Future的唯一实现类。

实现了Callable的对象

class Task implements Callable {

@Override

public String call() throws Exception {

TimeUnit.SECONDS.sleep(5);

System.out.println("我睡了5s");

return "success";

}

}

方法1:通过FutureTask包装task,然后使用Thread的方式执行

public static void main(String[] args) throws InterruptedException, ExecutionException {

Task task = new Task();

/**

* 用FutureTask包装Task对象,然后给thread去执行

*/

FutureTask ft = new FutureTask(task);

new Thread(ft).start();

System.out.println("主线程获取运行结果为:"+ft.get());

}

方法2:通过FutureTask包装task,然后使用线程池的方式执行

public static void main(String[] args) throws InterruptedException, ExecutionException {

ExecutorService executorService = Executors.newCachedThreadPool();

Task task = new Task();

/**

* 用FutureTask包装Task对象,然后给线程池去执行

*/

FutureTask ft = new FutureTask(task);

Future result = executorService.submit(task);

executorService.shutdown();

System.out.println("主线程获取运行结果为:"+result.get());

}

方法3:直接使用线程池提交Callable对象

public static void main(String[] args) throws InterruptedException, ExecutionException {

ExecutorService executorService = Executors.newCachedThreadPool();

Task task = new Task();

Future result = executorService.submit(task);

executorService.shutdown();

System.out.println("主线程获取运行结果为:"+result.get());

}

总结

Future是一个接口, FutureTask类是Future 的一个实现类,并实现了Runnable,因此FutureTask可以传递到线程对象Thread中新建一个线程执行。所以可通过Excutor(线程池) 来执行,也可传递给Thread对象执行。

futuretask java 并发请求_Java并发案例04---Future和 FutureTask相关推荐

  1. futuretask java 并发请求_Java并发编程:Callable、Future和FutureTask

    Java并发编程:Callable.Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一 ...

  2. futuretask java 并发请求_Java并发机制(9)--Callable、Future、FutureTask的使用

    Java并发编程:Callable.Future.FutureTask的使用 继承关系: 1.接口Callable与Runnable 1.1.Runnable接口中只有一个void run()方法,其 ...

  3. Java中的Runnable、Callable、Future、FutureTask

    Java中存在Runnable.Callable.Future.FutureTask这几个与线程相关的类或者接口,在Java中也是比较重要的几个概念,我们通过下面的简单示例来了解一下它们的作用于区别. ...

  4. Java中的Runnable、Callable、Future、FutureTask的区别与示例

    原文地址:http://blog.csdn.net/bboyfeiyu/article/details/24851847 --------------------------------------- ...

  5. futuretask java 并发请求_Java面试题整理一(侧重多线程并发)

    1..是否可以在static环境中访问非static变量? 答:static变量在Java中是属于类的,它在所有的实例中的值是一样的.当类被Java虚拟机载入的时候,会对static变量进行初始化.如 ...

  6. futuretask java 并发请求_【Java并发】Runnable、Callable、Future、FutureTask

    创建线程的两种方式 直接继承 Thread 实现 Runnable 接口 这两种方式都有一个缺点:在执行完成任务之后,无法直接获取到最后的执行结果.如果需要获取执行结果,就必须通过共享变量或线程通信的 ...

  7. java executor 异步_Java并发编程11-异步执行框架Executor

    1 Executor框架的简介 1.5后引入的Executor框架的最大优点是把任务的提交和执行解耦.要执行任务的人只需把Task描述清楚,然后提交即可.这个Task是怎么被执行的,被谁执行的,什么时 ...

  8. 【Java并发】Runnable、Callable、Future、FutureTask

    创建线程的两种方式 直接继承 Thread 实现 Runnable 接口 这两种方式都有一个缺点:在执行完成任务之后,无法直接获取到最后的执行结果.如果需要获取执行结果,就必须通过共享变量或线程通信的 ...

  9. java并发排它锁_Java并发编程进阶——锁(解析)

    一.锁是什么 java开发中进行并发编程时针对操作同一块区域时,如果不加锁会出现并发问题,数据不是自己预计得到的值.我觉得有点像mysql事务中脏读.不可重复读.幻读的问题.加锁的目的是为了保证同一时 ...

最新文章

  1. 剑指offer:面试题12. 矩阵中的路径
  2. SQL视频总结(2)
  3. ES6(三)数组的扩展
  4. 简单好用!利用Spring AOP技术10分钟实现一个读写分离方案
  5. 大量执行OSS PutObject时卡住的问题排查
  6. Java学习笔记之:Java String类
  7. Linux网站访问的电脑占CPU,详解Linux如何查看当前占用CPU或内存最多的几个进程...
  8. Linux中的内存段(BSS、数据段、代码段、堆、栈)
  9. XML NameSpace
  10. hpml350服务器安装系统,安装HP ML350
  11. es5.4.0-CentOS-6.5-x86_64安装文档
  12. 从前端开发者看待用友建筑云移动端单点登录与报错原因
  13. 《电机学和电机驱动入门》
  14. 数据挖掘入门到精通—R语言视频教程
  15. IntelliJ IDEA使用教程(新手入门--持续更新)
  16. STM8L低功耗停止看门狗
  17. U-Boot中ubi和ubifs命令的使用
  18. neural networks logistic regression 神经网络逻辑回归
  19. 晶品特装在科创板上市:总市值约为48亿元,前三季度收入下滑12%
  20. Android Studio BMI计算器设计(三种计算标准)

热门文章

  1. 95-862-045-源码-runtime-blob-BlobService
  2. 【ElasticSearch】Es 源码之 IndicesModule 源码解读
  3. 【Spring】Spring NoSuchMethodError okhttp3.internal.platform.Platform.log(ILjava/lang/String;Ljava/lan
  4. 如何修改Git仓库的URL(地址)
  5. 干掉Dubbo !这个后端开发框架就是王者!
  6. MySQL 成薪资跳板了?
  7. MySQL表的操作(一)
  8. oracle中以dba_、user_、v$_、all_、session_、index_开头
  9. 计算机辅助翻译课怎么学的,计算机辅助翻译原理与实践
  10. 【java.lang.NoClassDefFoundError: t/SpringBootConfiguration】