java 多线程 Future callable
面向对象5大设计原则
1.单一职责原则 一个类只包含它相关的方法,增删改查。一个方法只包含单一的功能,增加。一个类最多包含10个方法,一个方法最多50行,一个类最多500行。重复的代码进行封装,Don't Repeat Youself。
2.开放-封闭原则 类的设计对读取开放,对修改关闭。
3.里氏转换原则 子类可以转换成父类,父类可以强制转换成(转换成父类的)子类。
4.依赖倒置原则 类似于IOC 容器
5.接口隔离原则 暂时不知道。
参考链接:http://www.cnblogs.com/peijihui/archive/2012/04/07/2436127.html
-----------------------------------------------------------------------------------------------
Futrue的功能:子线程完成后 通知主线程。
public class CallableAndFuture {
/**
* @param args
*/
public static void main(String[] args) {
ExecutorService threadPool = Executors.newSingleThreadExecutor();
Future<String> future =
threadPool.submit(
new Callable<String>() {
public String call() throws Exception {
Thread.sleep(2000);
return "hello";
};
}
);
System.out.println("等待结果");
try {
System.out.println("拿到结果:" + future.get()); //阻塞主线程
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
futrue.get()其实阻塞了主线程,主线程会调用get方法获取结果,没有结果则等待。我在主线程中写一个方法也是等待,所以为什么要开子线程,为什么用future?
答:1.异步计算 (主线程计算10次==10个子线程计算一次)
http://jiangwenfeng762.iteye.com/blog/1325175
根据分而治之的思想,我们可以把异步计算的线程按照职责分为3类:
1. 异步计算的发起线程(控制线程):负责异步计算任务的分解和发起,把分解好的任务交给异步计算的work线程去执行,发起异步计算后,发起线程可以获得Futrue的集合,从而可以跟踪异步计算结果
2. 异步计算work线程:负责具体的计算任务
3. 异步计算结果收集线程:从发起线程那里获得Future的集合,并负责监控Future的状态,根据Future的状态来处理异步计算的结果。
/**
* Futrue的应用场景
*
* @author
*
*/
public class CallableAndFuture_My { // 异步计算
public static class Task implements Callable<Integer> { @Override
public Integer call() throws Exception {
// System.out.println(Thread.currentThread().getName()+ " : executor!!!");
Random random=new Random();
int i=random.nextInt(10);
System.out.println(Thread.currentThread().getName()+" : "+ i);
return i;
} } public static void main(String[] args) {
List<Future<Integer>> results = new ArrayList<Future<Integer>>();
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 30; i++) {
results.add(executorService.submit(new Task()));
}
System.out.println("main waiting!");
int count=0;
for (Future<Integer> future : results) {
try {
count+=future.get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} System.out.println("main complete : "+count);
if (!executorService.isShutdown()) {
executorService.shutdown();
} }
}
2.多线程协作,比如菲波拉切数列,1,1,2,3,5,8... 后者需要前者的结果,就需要callable接口了,Future登场
http://blog.csdn.net/dabing69221/article/details/17595031
java 多线程 Future callable的更多相关文章
- Java多线程Future模式
Java多线程Future模式有些类似于Ajax的异步请求Future模式的核心在于:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑 假设服务器的处理某个业务,该业务可以分 ...
- java多线程Future和Callable类的解释与使用
一,描写叙述 在多线程下编程的时候.大家可能会遇到一种需求,就是我想在我开启的线程都结束时,同一时候获取每一个线程中返回的数据然后再做统一处理,在这种需求下,Future与Callable的组合就派 ...
- Java 多线程Future和FutureTask
Future表示一个任务的周期,并提供了相应的方法来判断是否已经完成或者取消,以及获取任务的结果和取消任务. Future接口源码: public interface Future<V> ...
- java 多线程:Callable接口;FutureTask类实现对象【Thread、Runnable、Callable三种方式实现多线程的区别】
Callable接口介绍: Java5开始,Java提供了Callable接口,像是Runnable接口的增强版,Callable接口提供了一个 call()方法可以作为线执行体. call()方法比 ...
- Java 多线程 - Future
Java中Future的使用场景和解析 https://blog.csdn.net/hongtaolong/article/details/83349705 (细看!!!)
- Java多线程知识-Callable和Future
Callable和Future出现的原因 创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需 ...
- Java多线程:Callable,Future,FutureTask
一.Future Future和Callable基本是成对出现的,Callable负责产生结果,Future负责获取结果. 1.Callable接口类似于Runnable,只是Runnable ...
- Java多线程的Callable, Future, FutureCallback
Callable可以看成是一个增强版的Runnable, 带返回结果, 需要通过Future或者FutureTask来提交任务或运行线程, 然后通过Future/FutureTask的get方法得到返 ...
- Java多线程编程:Callable、Future和FutureTask浅析(多线程编程之四)
java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)java多线程同步以及线程间通信详解&消费者生产者模式&死锁& ...
随机推荐
- JAVA里面的“指针”
JAVA里面的“指针” 众所周知,在java里面是没有指针的.那为何此处还要说java里面的“指针”呢?我们知道在C/C++中,指针是指向内存中的地址.那么在Java里 ...
- 【刷题】UOJ #274 【清华集训2016】温暖会指引我们前行
寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 "冻死宝宝了!" 这时 远处的天边出现了一位火焰之神 "我将赐予你们温暖和希望! ...
- 【spring学习笔记二】Bean
### bean的三种实例化方式: 1.构造 2.静态工厂 3.实例工厂 其中,工厂就是工厂的概念,工厂函数factor-method会返回她生产出来的产品类. 而构造初始化也可以选择初始化方式和销毁 ...
- 安装GourdScanV2的踩坑过程
环境:ubuntu 16.04.1 1.安装dcoker sudo apt-get install docker.io 坑:sudo apt-get install docker 2.下载关于dock ...
- logstash5生成init脚本后台启动
默认情况使用rpm包安装完logstash之后没有启动脚本,这一点我觉得算是开发不够彻底.官网给了一个脚本,需要根据不同的系统版本生成对应的启动脚本,而且官网没有给明使用方法,对于新用户来说算是个坑, ...
- 安装Xtrabackup,设置定时备份msyql数据库
Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具. XtraDB 存储引擎是由Perco ...
- redis协议
Redis的通讯协议可以说大集汇了……消息头标识,消息行还有就行里可能还有个数据块大小描述.首先Redis是以行来划分,每行以\r\n行结束.每一行都有一个消息头,消息头共分为5种分别如下: (+) ...
- 浏览器json数据格式化
在浏览器上作接口测试的时候看到json 格式的数据是密密麻麻的一片,眼睛都花了.. 如: 设置方法: chrome 的右上角选择,然后--- 更多工具--- 扩展程序 ---- JSO ...
- 在Kubernetes集群里安装微服务DevOps平台fabric8
转载于https://blog.csdn.net/wzp1986/article/details/72128063?utm_source=itdadao&utm_medium=referral ...
- NATS_10:NATS服务配置文件详解
尽管NATS可以无配置的运行,但也可以使用配置文件配置NATS服务的启动,在实际应用当中,一般都是通过使用配置文件来启动服务的. 1. 配置项包括 客户端监听器端口 Client listening ...