- 浏览: 518937 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (161)
- 多线程与并发编程 (20)
- 算法和数据结构 (8)
- 缓存 (0)
- HttpClient (2)
- 疑难杂症 (11)
- Java内存管理 (17)
- 分布式开发 (14)
- Linux常用命令 (10)
- OSGI (0)
- UML (2)
- 趣味面试题 (5)
- 设计模式 (8)
- Java类加载 (2)
- JSTL (1)
- Web 服务器 (4)
- IT人生 (3)
- Java基础 (11)
- Flash技术 (7)
- 新知识 (3)
- 常用速备速查 (4)
- 版本控制 (1)
- Java集合工具类 (6)
- web前端技术 (1)
- 趣味话题 (1)
- 安全 (0)
- 架构设计 (5)
- Spring (4)
- 负载均衡技术 (2)
- 持久层技术 (2)
- MySQL单机多实例方案 (1)
- 收藏备用 (0)
- 性能优化 (3)
最新评论
-
liuwuhen:
...
Pushlet的工作原理 -
fbwfbi:
fengchuizhuming 写道楼主的完全正确。鉴定完毕楼 ...
硬件同步原语(CAS)理论 -
passerby_whu:
uule 写道这个测试后结果为:“testPageConten ...
FutureTask的使用方法和使用实例 -
fengchuizhuming:
楼主的完全正确。鉴定完毕
硬件同步原语(CAS)理论 -
edwardjuice:
FutureTask的使用方法和使用实例
当向Executor提交批处理任务时,并且希望在它们完成后获得结果,如果用FutureTask,你可以循环获取task,并用future.get()去获取结果,但是如果这个task没有完成,你就得阻塞在这里,这个实效性不高,其实在很多场合,其实你拿第一个任务结果时,此时结果并没有生成并阻塞,其实在阻塞在第一个任务时,第二个task的任务已经早就完成了,显然这种情况用future task不合适的,效率也不高的,实例如下:
实例一:用一个非complete Service完成的批量任务
package completeservice;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
/**
*
*<p>Test</p>
*<p>Description:</P>
*<p>Company:Cisco CAS</p>
*<p>Department:CAS</p>
*@Author: Tommy Zhou
*@Since: 1.0
*@Version:Date:2011-5-11
*
**/
public class NonCompleteServiceTest {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService executorService = Executors.newFixedThreadPool(10);
Future<String>[] futures = new FutureTask[10];
/**
* 产生一个随机数,模拟不同的任务的处理时间不同
*/
for (int i = 0; i < 10; i++) {
futures[i] = executorService.submit(new Callable<String>() {
public String call(){
int rnt = new Random().nextInt(5);
try {
Thread.sleep(rnt*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("run rnt = "+rnt);
return String.valueOf(rnt*1000);
}
});
}
/**
* 获取结果时,如果任务没有完成,则阻塞,在顺序获取结果时,
* 可能别的任务已经完成,显然效率不高
*/
for (int i = 0; i < futures.length; i++) {
System.out.println(futures[i].get());
}
executorService.shutdown();
}
}
package completeservice;
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;
/**
*
*<p>Test</p>
*<p>Description:</P>
*<p>Company:Cisco CAS</p>
*<p>Department:CAS</p>
*@Author: Tommy Zhou
*@Since: 1.0
*@Version:Date:2011-5-11
*
**/
public class CompleteServiceTest {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService executorService = Executors.newFixedThreadPool(10);
CompletionService<String> completionService = new ExecutorCompletionService<String>(executorService);
/**
* 产生一个随机数,模拟不同的任务的处理时间不同
*/
for (int i = 0; i < 10; i++) {
completionService.submit(new Callable<String>() {
public String call(){
int rnt = new Random().nextInt(5);
try {
Thread.sleep(rnt*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("run rnt = "+rnt);
return String.valueOf(rnt*1000);
}
});
}
/**
* 获取结果时,总是先拿到队列上已经存在的对象,这样不用依次等待结果
* 显然效率更高
*/
for (int i = 0; i < 10; i++) {
Future<String> future = completionService.take();
System.out.println(future.get());
}
executorService.shutdown();
}
}
发表评论
-
死锁实例
2011-05-19 14:21 1902下面这道题,是考死锁的,比较简单,想两个问题: 1.什么时候 ... -
Java存储模型
2011-05-18 13:29 01.什么是存储模型 没有适当的同步,编译器生成指令的次序,可 ... -
设计模式-组合模式
2011-05-16 15:48 1072组合模式的定义: 将对象组合成树的形式来表示整体和局部之 ... -
CyclicBarrier的使用实例
2011-05-11 15:45 1438CyclicBarrier允许给定数量的线程全部到达关卡点时, ... -
CopyOnWriteArrayList工作原理和实例
2011-05-05 23:43 3340CopyOnWriteArrayList顾名思义,在写入操作时 ... -
Semaphore的介绍和使用实例
2011-04-27 22:32 2766Semaphore可以用来控制能 ... -
FutureTask的使用方法和使用实例
2011-04-27 15:34 13253FutureTask是一种可以取消的异步的计算任务。它的计算是 ... -
CountDownLatch的使用实例
2011-04-26 22:20 8181CountDownLatch CountDownl ... -
Java 并发编程基础-共享对象
2011-04-19 14:48 1406Java 并发编程基础 ... -
从JVM并发看CPU内存指令重排序(Memory Reordering)
2011-04-18 16:17 1445我们都知道,现在的计算机, cpu 在计算的时候 ... -
Java并发编程基础
2011-04-15 14:55 1512Java 并发编程基 ... -
Java多线程基础
2011-04-13 15:52 4698Java 多线程基础 ... 2 ... -
硬件同步原语(CAS)理论
2010-09-24 22:13 6948在Java并发编程中,常常 ... -
java5中使用interrupt()来停止java线程的方法(转)
2010-08-18 23:24 3058在开发java多线程时,如果要停止线程这个问题很头痛吧,不过在 ... -
Java 中的Double Check Lock(转)
2010-07-27 21:13 8041对于多线程编程来说,同步问题是我们需要考虑的最多的问题,同步的 ... -
并发访问的问题解决方案
2010-07-26 18:15 1965目前正在做基于Red 5 的Meeting系统,我们会在Mee ... -
用并发包中的重入锁实现生产消费模型
2010-06-15 00:07 1397传统的生产消费模型,实际上是通过一个条件来调节生产者和消费者线 ... -
ThreadLocal原理(转)
2010-03-24 18:06 2126http://jzhua.iteye.com/blog/517 ... -
(转)Java偏向锁实现原理(Biased Locking)
2010-03-21 22:24 1325http://www.iteye.com/topic/5180 ... -
生产消费模型实例
2010-03-02 23:23 1674“生产者-消费者-仓储”模型,包含三种角色: 1.生产者 ...
相关推荐
GDB调试精粹及使用实例GDB调试精粹及使用实例GDB调试精粹及使用实例GDB调试精粹及使用实例GDB调试精粹及使用实例GDB调试精粹及使用实例GDB调试精粹及使用实例GDB调试精粹及使用实例GDB调试精粹及使用实例GDB调试精粹...
VS C# 介绍 控件 使用 实例 使用大全 范例 例子
详细的介绍了fromview的使用方法,加上本人实例
正交设计助手II3.1软件介绍及使用实例说明.pdf正交设计助手II3.1软件介绍及使用实例说明.pdf正交设计助手II3.1软件介绍及使用实例说明.pdf正交设计助手II3.1软件介绍及使用实例说明.pdf正交设计助手II3.1软件介绍及...
Linux磁盘管理之df命令详细介绍和使用实例.docx
详细介绍Log4j使用实例
Openairinterface项目介绍以及使用实例,个人根据工作经验和需求,对Openairinterface项目进行了介绍,主要包括项目的功能和历史,并对5G研究做了概述。
c#接口详细介绍及实例c#接口详细介绍及实例c#接口详细介绍及实例c#接口详细介绍及实例
HFSS Antenna Design Kit的使用介绍和应用实例讲解
《C#开发实例大全(基础卷)》既适合C#程序员参考和查阅,也适合C#初学者,如高校学生、软件开发培训学员及相关求职人员学习、练习、速查使用。 第1篇 C#编程基础篇 第1章 C#开发环境的使用 2 1.1 Visual Studio...
struts2实例和详细介绍struts2实例和详细介绍struts2实例和详细介绍struts2实例和详细介绍struts2实例和详细介绍struts2实例和详细介绍
uml实例uml实例uml实例uml实例uml实例uml实例uml实例uml实例uml实例uml实例uml实例uml实例uml实例uml实例uml实例uml实例uml实例uml实例
实例1 如何使用错误提醒控件 实例2 如何使用信息提示控件 实例3 如何使用菜单控件 实例4 如何使用工具栏控件 实例5 如何使用状态栏控件 实例6 如何使用托盘控件 实例7 如何使用标签页控件 实例8 如何使用进度条控件 ...
HBuilder 项目,PDF.js 的使用实例
详细介绍了 oracle的游标使用 及 实例
VSFlexGrid1控件多种使用方法实例,比较全面。
lucene3.0使用介绍及实例,从不同的使用方面介绍了lucene的使用及相应的实例。
最牛逼的Linux awk命令详细介绍和实例快速学习