10、java5线程池之返回结果的任务之Callable与Future
JDK文档描述Callable:
public interface Callable<V>返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做 call 的方法。 Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。 Executors 类包含一些从其他普通形式转换成 Callable 类的实用方法
唯一的一个方法是:
call
V call()
throws Exception计算结果,如果无法计算结果,则抛出一个异常。 返回:
计算的结果
抛出:
Exception - 如果无法计算结果
JDK文档描述Future:
public interface Future<V>Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明 Future<?> 形式类型、并返回 null 作为底层任务的结果。
主要的方法有:
| 方法摘要 | |
| boolean | cancel(boolean mayInterruptIfRunning) 试图取消对此任务的执行 |
| V | get() 如有必要,等待计算完成,然后获取其结果。 |
| V | get(long timeout, TimeUnit unit) 如有必要,最多等待为使计算完成所给定的时间之后,获取其结果(如果结果可用)。 |
| boolean | isCancelled() 如果在任务正常完成前将其取消,则返回 true。 |
| boolean | isDone() 如果任务已完成,则返回 true。 |
例子:
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; public class ThreadPool2 {
public static void main(String[] args) {
test1();
} private static void test1(){
ExecutorService es = Executors.newFixedThreadPool(2); for(int i=1 ; i<=5; i++){
final int task = i;
Future<Integer> future = es.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Callable 任务【" + task + "】运行");
return new Random().nextInt(100);
}
}); System.out.println("当前提交第【" + i + "】返回结果的任务"); try {
System.out.println("任务【" + i + "】返回的结果:" + future.get());
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("我是for循环后面的代码----------");
es.shutdown();
}
}
运行结果:
当前提交第【1】返回结果的任务
Callable 任务【1】运行
任务【1】返回的结果:49
当前提交第【2】返回结果的任务
Callable 任务【2】运行
任务【2】返回的结果:92
当前提交第【3】返回结果的任务
Callable 任务【3】运行
任务【3】返回的结果:17
当前提交第【4】返回结果的任务
Callable 任务【4】运行
任务【4】返回的结果:96
当前提交第【5】返回结果的任务
Callable 任务【5】运行
任务【5】返回的结果:14
我是for循环后面的代码----------
10、java5线程池之返回结果的任务之Callable与Future的更多相关文章
- 9、java5线程池之定时任务线程池newScheduledThreadPool与newSingleThreadScheduledExecutor
JDK文档描述 newSingleThreadScheduledExecutor() 创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行.(注意,如果因为在关闭前的执行期间出现失败而终 ...
- 6、java5线程池之固定大小线程池newFixedThreadPool
JDK文档说明: 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程.在任意点,在大多数 nThreads 线程会处于处理任务的活动状态.如果在所有线程处于活动状态时提交附加任务,则 ...
- 8、java5线程池之动态缓存线程池newCachedThreadPool
JDK文档描述 创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们.对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能.调用 execute 将重用以前构造的线程 ...
- Java并发编程之线程创建和启动(Thread、Runnable、Callable和Future)
这一系列的文章暂不涉及Java多线程开发中的底层原理以及JMM.JVM部分的解析(将另文总结),主要关注实际编码中Java并发编程的核心知识点和应知应会部分. 说在前面,Java并发编程的实质,是线程 ...
- python并发——从线程池获取返回值
并发是快速处理大量相似任务的绝佳办法,但对于有返回值的方法,需要一个容器专门来存储每个进程处理完的结果 from multiprocessing import Pool import time #返回 ...
- 11、java5线程池之异步任务CompletionService
JDK文档描述: public interface CompletionService<V> 将生产新的异步任务与使用已完成任务的结果分离开来的服务.生产者 submit 执行的任务.使用 ...
- 7、java5线程池之单一线程池newSingleThreadExecutor
JDK文档说明: 创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程.(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执 ...
- java核心知识点学习----重点学习线程池ThreadPool
线程池是多线程学习中需要重点掌握的. 系统启动一个新线程的成本是比较高的,因为它涉及与操作系统交互.在这种情形下,使用线程池可以很好的提高性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考 ...
- Java多线程学习(八)线程池与Executor 框架
目录 历史优质文章推荐: 目录: 一 使用线程池的好处 二 Executor 框架 2.1 简介 2.2 Executor 框架结构(主要由三大部分组成) 2.3 Executor 框架的使用示意图 ...
随机推荐
- 层次聚类 Hierarchical Clustering
-------------------------------- 不管是GMM,还是k-means,都面临一个问题,就是k的个数如何选取?比如在bag-of-words模型中,用k-means训练码书 ...
- pssh,pdsh,mussh,cssh,dsh运维工具介绍
pssh 1 安装:#wget http://peak.telecommunity.com/dist/ez_setup.pypython ez_setup.py#wget http://paralle ...
- jcseg-1.8.7版本发布 - 多配置适应+完整开发帮助文档
jcseg是使用java开发的一款开源中文分词器, 并且提供了最新版本的lucene和solr分词接口. jcseg 1.8.7版本发布了: 1. 更改了内部设计, 加入JcsegTaskConfig ...
- Netty端口被占用问题
问题: 最近发现Netty项目每次发布的时候Netty在重启时都会报端口被占用的异常, 需要过十几秒左右手动重启一遍, Netty才能恢复正常 目前猜测是由于Tomcat_restart的时候Ne ...
- 要恢复页面吗?Chrome未正确关闭
谷歌chrome浏览器每次打开提示"要恢复页面吗"怎么办? 谷歌chrome浏览器每次打开提示"要恢复页面吗"怎么办? 如下图所示: 每次打开启动谷歌chrom ...
- 【ContestHunter】【弱省胡策】【Round0】(A)&【Round1】(B)
DP+容斥原理or补集转化?/KD-Tree 唔……突然发现最早打的两场(打的最烂的两场)没有写记录……(太烂所以不忍记录了吗... 还是把搞出来了的两道题记录一下吧= =勉强算弥补一下缺憾…… Ro ...
- QT TCP网络编程
首先介绍一下TCP:(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议.相比而言UDP,就是开放式.无连接.不可靠的传输层 ...
- webpack打包器简单入门
概念 webpack是一个现代javascript应用程序的模块打包器. 当webpack处理你的应用程序时,它会递归构建一个依赖图(包含了你的应用程序所需要每个模块),然后把这些模块打包到少数几个b ...
- css之图片羽化处理
需求: 对图片做css羽化处理 实现: <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- Vue背景图打包之后访问路径错误
问题背景:项目里面有用到背景图片,开发模式下正常,打包之后发现报404错误.查看发现是背景图片引用路径出错. 解决方法: .map { width: %; height: 397px; backgro ...