Runnable、Callable、Future、RunnableFuture 和 FuturTask 到底是些啥,到底有啥关系?
直接上来先说结论(我比较喜欢这种方式,毕竟有的文章一开始就给你讲论证,讲了半天都不知道论题的结果是什么)
{@interface Runnable} :他的表示是希望被另一个线程所执行,有点抽象,说白了,就是你这个接口所实现的类,java是希望你放到Thread里面去执行的,去start的。
@interface Callable} : 他首先类似于Runnable,他的设计之初也同样是希望被另一个线程所执行,但是他是有返回值的。
{@interface Future} :首先它是一个接口。其次,他表示的是一个异步的计算结果,注意,他表示的只是一个结果,并不表示它是一个可执行的Thread,类比一下Runnable。
//如果任务还没开始,执行cancel(...)方法将返回false;
//如果任务已经启动,执行cancel(true)方法将以中断执行此任务线程的方式来试图停止任务,
//如果停止成功,返回true;
//当任务已经启动,执行cancel(false)方法将不会对正在执行的任务线程产生影响(让线程正常执行到完成),
//此时返回false;
//当任务已经完成,执行cancel(...)方法将返回false。
//mayInterruptRunning参数表示是否中断执行中的线程。
boolean cancel(boolean mayInterruptIfRunning);
//如果任务完成前被取消,则返回true。
boolean isCancelled();
//如果任务执行结束,无论是正常结束或是中途取消还是发生异常,都返回true。
boolean isDone();
//获取异步执行的结果,如果没有结果可用,此方法会阻塞直到异步计算完成。
V get() throws InterruptedException, ExecutionException;
//获取异步执行结果,如果没有结果可用,此方法会阻塞,但是会有时间限制,
//如果阻塞时间超过设定的timeout时间,该方法将抛出异常。
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
{@interface RunnableFuture extends Runnable, Future<V>} :依然是一个接口,并且继承自 Runnable(这玩意儿不解释了吧)、Future。他表示的是一个应该被异步线程执行的(Runnable的语义,毕竟是接口,只有靠语义来描述,毕竟你爱咋实现,他也管不着),并且可以允许访问其结果的。
void run();
这个方法,嗯... 怎么说呢,他确实是和Runnable里的run()重叠了,但是我理解他这里可能是想加强语义,让大家能把RunnableFuture和Future这俩玩意儿区别开
{@class FuturTask implements RunnableFuture<V>} : ok,这玩意儿是一个实现类,实现了RunnableFuture 接口,我用一段源码带大家感受一下,比较口述能力有限。
java.util.concurrent.AbstractExecutorService#submit(java.util.concurrent.Callable<T>)
java.util.concurrent.AbstractExecutorService#newTaskFor(java.util.concurrent.Callable<T>)
感受到了吗?首先AbstractExecutorService,这个东西,是线程池也就是大家熟知的ThreadPoolExecutor的继承类,他又实现于ExecutorService。ok,所以上面这段代码,就是当我创建一个任务向线程池提交的时候(submit)的方法。
ok,bb了怎么多,有的小伙伴还是没有感觉,下面,举一个例子找找感觉
这再没有感觉,我也没办法了
Runnable、Callable、Future、RunnableFuture 和 FuturTask 到底是些啥,到底有啥关系?相关推荐
- Java并发编程举例Runnable, Callable, Future, FutureTask, CompletionService
import java.util.concurrent.*;/*** Created by chenh on 2017/3/23.*/ public class ConcurrentDemo {// ...
- 项目管理课件_项目管理(PMO)工作到底干些啥?
可能大家都会疑惑,项目管理工作到底干些啥?如何来做价值提升?最近刚好沉淀下来整理一下项目管理的工作,当然还不全面,后续会持续补充. 从我个人经验来理解项目管理,他的工作职责主要是以下几大块(每个公司对 ...
- 全新版大学英语综合教程第一册学习笔记(原文及全文翻译)——6 - What Animals Really Think(动物到底想些什么)
Unit 6 - What Animals Really Think(动物到底想些什么) Food, warmth, sleep? Their thoughts may be much deeper ...
- 图解人工智能知识架构(从知识角度告诉你人工智能到底学些啥)
很多人都想学习人工智能,但是却不知道该学些啥?从宏观的视角搞清楚人工智能到底需要学习哪些领域的知识是至关重要的.这就好比要去逛一座大的商场,非常需要一份商场的楼层导览图,它能够告诉你各个楼层商户的分布 ...
- 图解人工智能知识架构(从系统角度告诉你人工智能到底学些啥)
很多人都想学习人工智能,但是却不知道该学些啥?从宏观的视角搞清楚人工智能到底需要学习哪些领域的知识是至关重要的.这就好比要去逛一座大的商场,非常需要一份商场的楼层导览图,它能够告诉你各个楼层商户的分布 ...
- 关于态势感知,客户到底需要些什么?
在考虑这个问题之前,我有问过自己:"到底什么是态势感知?".按照网络上的说法,态势感知是一种基于环境的.动态.整体地洞悉安全风险的能力.是以安全大数据为技术,灵活地从庞大的工具堆栈 ...
- Java线程池 / Executor / Callable / Future
为什么需要线程池? 每次都要new一个thread,开销大,性能差:不能统一管理:功能少(没有定时执行.中断等). 使用线程池的好处是,可重用,可管理. Executor 4种线程池 // 可缓存线程 ...
- callable线程池示例_Java Callable Future示例
callable线程池示例 Java Callable and Future are used a lot in multithreaded programming. In last few post ...
- 多线程 -Thread -Runnable -Callable
多线程(Thread) 线程简介 线程实现 线程状态 线程同步 线程通信问题 高级主题 核心概念 线程就是独立的执行路径; 在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc程; ...
最新文章
- 全球机器换人排行榜!这八个国家遥遥领先
- 列名无效怎么解决_电脑win键失效怎么办? 键盘win键无效的解决办法
- java spring cloud版b2b2c社交电商spring cloud分布式微服务-docker-feign-hystrix(六)
- node.js之stream模块
- 深入理解Java中的String
- ASP.NET Core 中文文档 第三章 原理(13)管理应用程序状态
- python网络编程实例简析
- fluentd主从配置
- 字符串对象的各种方法
- Leetcode刷题(1)两数之和
- python计算数组元素的和_python中数组的运算
- 防御CSRF、XSS和SQL注入***
- C语言 标准I/O库: stdio.h
- Redis集群环境搭建
- flash视频的param属性解释
- PS1045L-ASEMI肖特基二极管PS1045L正向压降怎么测
- python源码解读之 string.py
- 0基础学python,聊聊这半年我是如何自学编程
- 债券ETF认申赎_基金合同_嘉实基金
- 获取微信中的音频方法
热门文章
- 瞻仰了一下Gavin King的风采
- vsCode中Git的使用
- 急性扁桃体炎药物治疗
- python怎么编程十进制转化成二进制_【Python秘籍】十进制整数与二进制数的转换...
- mysql normal 索引_Mysql索引PRIMARY、NORMAL、UNIQUE、FULLTEXT 区别和使用场合
- 15000个彩色小图标素材,含PNG/Ai/SVG多格式,设计师前端必备资源
- Qualcomm 8916平台实现裸板USB烧录
- 考古20年前的国产CPU:方舟一号和龙芯一号
- java记事本查找_记事本的查找技术
- 用Python开发Android app