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多线程同步以及线程间通信详解&消费者生产者模式&死锁& ...
随机推荐
- Latex编译过程中遇到的奇奇怪怪的问题及解决方案
标签(空格分隔): 杂七杂八的问题 有必要写一个博文记录自己在Latex编译时遇到的各种问题,希望可以帮到遇到同样错误的亲故.讲真,一直没有系统的学习Latex,都是投哪个会直接拿那个会的模板来套,然 ...
- 【刷题】BZOJ 1537 [POI2005]Aut- The Bus
Description Byte City 的街道形成了一个标准的棋盘网络 – 他们要么是北南走向要么就是西东走向. 北南走向的路口从 1 到 n编号, 西东走向的路从1 到 m编号. 每个路口用两个 ...
- number类型转化为string类型
toString 方法 string = toString(num) 缺点: 不能转化 underfind 和 null 2 String 方法 string = String(num) 可以转化 u ...
- Linux内核设计第七周学习总结 Linux内核如何装载和启动一个可执行程序
陈巧然原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 实验目的 使用gdb跟踪s ...
- MyBatis.2剖析
上次给大家介绍了一下properties 和 environments 的配置, 接下来就正式开始看源码了: 上次例子中,我们以 SqlSessionFactoryBuilder 去创建 SqlSes ...
- POI操作word和html相互转化
下面是里两个类:第一个类是html转为word,第二个是word转html(最下面附上jar包下载链接) package com.wz.poi.wordHtml; /** * 2018/4/24 * ...
- 解题:USACO13NOV No Change
题面 在朴素中透着一点新意的状压DP 一个很暴力的思路是枚举位置,状态和硬币,每次二分出向前最多能买到哪里,复杂度爆炸($O(2^knklog$ $n)$) 考虑优化,不妨先预处理一下$goal[i] ...
- CDOJ--1141
原题链接:http://acm.uestc.edu.cn/problem.php?pid=1141 分析:运用欧拉函数可解此题. #include <iostream> #include ...
- The POSIX API/nss/nscd
https://code.google.com/p/nsscache/wiki/BackgroundOnNameServiceSwitch The POSIX API POSIX is a stand ...
- Consul 服务发现与配置
Consule 是什么 Consul包含多个组件,但是作为一个整体,为你的基础设施提供服务发现和服务配置的工具.他提供以下关键特性: 服务发现 Consul 的客户端可用提供一个服务,比如 api 或 ...