futuretask java 并发请求_Java并发案例04---Future和 FutureTask
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相关推荐
- futuretask java 并发请求_Java并发编程:Callable、Future和FutureTask
Java并发编程:Callable.Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一 ...
- futuretask java 并发请求_Java并发机制(9)--Callable、Future、FutureTask的使用
Java并发编程:Callable.Future.FutureTask的使用 继承关系: 1.接口Callable与Runnable 1.1.Runnable接口中只有一个void run()方法,其 ...
- Java中的Runnable、Callable、Future、FutureTask
Java中存在Runnable.Callable.Future.FutureTask这几个与线程相关的类或者接口,在Java中也是比较重要的几个概念,我们通过下面的简单示例来了解一下它们的作用于区别. ...
- Java中的Runnable、Callable、Future、FutureTask的区别与示例
原文地址:http://blog.csdn.net/bboyfeiyu/article/details/24851847 --------------------------------------- ...
- futuretask java 并发请求_Java面试题整理一(侧重多线程并发)
1..是否可以在static环境中访问非static变量? 答:static变量在Java中是属于类的,它在所有的实例中的值是一样的.当类被Java虚拟机载入的时候,会对static变量进行初始化.如 ...
- futuretask java 并发请求_【Java并发】Runnable、Callable、Future、FutureTask
创建线程的两种方式 直接继承 Thread 实现 Runnable 接口 这两种方式都有一个缺点:在执行完成任务之后,无法直接获取到最后的执行结果.如果需要获取执行结果,就必须通过共享变量或线程通信的 ...
- java executor 异步_Java并发编程11-异步执行框架Executor
1 Executor框架的简介 1.5后引入的Executor框架的最大优点是把任务的提交和执行解耦.要执行任务的人只需把Task描述清楚,然后提交即可.这个Task是怎么被执行的,被谁执行的,什么时 ...
- 【Java并发】Runnable、Callable、Future、FutureTask
创建线程的两种方式 直接继承 Thread 实现 Runnable 接口 这两种方式都有一个缺点:在执行完成任务之后,无法直接获取到最后的执行结果.如果需要获取执行结果,就必须通过共享变量或线程通信的 ...
- java并发排它锁_Java并发编程进阶——锁(解析)
一.锁是什么 java开发中进行并发编程时针对操作同一块区域时,如果不加锁会出现并发问题,数据不是自己预计得到的值.我觉得有点像mysql事务中脏读.不可重复读.幻读的问题.加锁的目的是为了保证同一时 ...
最新文章
- 剑指offer:面试题12. 矩阵中的路径
- SQL视频总结(2)
- ES6(三)数组的扩展
- 简单好用!利用Spring AOP技术10分钟实现一个读写分离方案
- 大量执行OSS PutObject时卡住的问题排查
- Java学习笔记之:Java String类
- Linux网站访问的电脑占CPU,详解Linux如何查看当前占用CPU或内存最多的几个进程...
- Linux中的内存段(BSS、数据段、代码段、堆、栈)
- XML NameSpace
- hpml350服务器安装系统,安装HP ML350
- es5.4.0-CentOS-6.5-x86_64安装文档
- 从前端开发者看待用友建筑云移动端单点登录与报错原因
- 《电机学和电机驱动入门》
- 数据挖掘入门到精通—R语言视频教程
- IntelliJ IDEA使用教程(新手入门--持续更新)
- STM8L低功耗停止看门狗
- U-Boot中ubi和ubifs命令的使用
- neural networks logistic regression 神经网络逻辑回归
- 晶品特装在科创板上市:总市值约为48亿元,前三季度收入下滑12%
- Android Studio BMI计算器设计(三种计算标准)
热门文章
- 95-862-045-源码-runtime-blob-BlobService
- 【ElasticSearch】Es 源码之 IndicesModule 源码解读
- 【Spring】Spring NoSuchMethodError okhttp3.internal.platform.Platform.log(ILjava/lang/String;Ljava/lan
- 如何修改Git仓库的URL(地址)
- 干掉Dubbo !这个后端开发框架就是王者!
- MySQL 成薪资跳板了?
- MySQL表的操作(一)
- oracle中以dba_、user_、v$_、all_、session_、index_开头
- 计算机辅助翻译课怎么学的,计算机辅助翻译原理与实践
- 【java.lang.NoClassDefFoundError: t/SpringBootConfiguration】