1、poll():马上返回完成的任务,若没有,则返回null

2、poll(long timeout, TimeUnit unit): 等待timeout时间,如果大于最短任务完成时间,则获取任务结果返回,结束等待;如果小于任务完成时间,则等待任务完成,获取结果并返回

实验代码:

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.TimeUnit; public class MyPoll { public static void main(String[] args) {
// TODO 自动生成的方法存根
ExecutorService executor=Executors.newCachedThreadPool();
CompletionService<String> comservice=new ExecutorCompletionService<String>(executor);
MyPollCallble callable=new MyPollCallble();
MyPollCallble_time time_cable=new MyPollCallble_time();
comservice.submit(callable);
comservice.submit(time_cable);
//poll():获取并移除表示下一个已完成任务的future。如果不存完成的任务,则返回null,即不会出现阻塞效果
// System.out.println(comservice.poll());
try {
//等待指定timeout时间,在timeout之内获得值即向下执行,如果超时也向下执行
System.out.println("get1 at"+System.currentTimeMillis());
System.out.println("1 "+comservice.poll(1000, TimeUnit.SECONDS).get());
System.out.println("get2 at"+System.currentTimeMillis());
System.out.println("2 "+comservice.poll(2000, TimeUnit.SECONDS).get());
System.out.println("get3 at"+System.currentTimeMillis());
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (ExecutionException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
} }
class MyPollCallble implements Callable<String>{ @Override
public String call() throws Exception {
// TODO 自动生成的方法存根
System.out.println("start");
System.out.println("first "+System.currentTimeMillis());
Thread.sleep(2000);
System.out.println("end "+System.currentTimeMillis());
return "finish";
} }
class MyPollCallble_time implements Callable<String>{ @Override
public String call() throws Exception {
// TODO 自动生成的方法存根
System.out.println("start time");
System.out.println("second "+System.currentTimeMillis());
Thread.sleep(3000);
System.out.println("end time "+System.currentTimeMillis());
return "finish time";
} }

  实验结果:

start
first 1492676279057
get1 at1492676279057
start time
second 1492676279057
end 1492676281061
1 finish
get2 at1492676281061
end time 1492676282064
2 finish time
get3 at1492676282064

  可以看到get1与get2之间相差2秒,表明是在等待任务完成,而不是未获得值继续向下执行

CompletionService的poll方法的更多相关文章

  1. Linux高级字符设备驱动 poll方法(select多路监控原理与实现)

    1.什么是Poll方法,功能是什么? 2.Select系统调用(功能)      Select系统调用用于多路监控,当没有一个文件满足要求时,select将阻塞调用进程.      int selec ...

  2. Linux 设备驱动--- Poll 方法 --- Select【转】

    转自:http://blog.csdn.net/yikai2009/article/details/8653842 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] Sele ...

  3. Queue接口分析:add和offer区别,remove和poll方法到底啥区别

    Queue接口: public interface Queue<E> extends Collection<E> { /* * add方法,在不违背队列的容量限制的情况,往队列 ...

  4. Python——IO多路复用之select模块poll方法

    Python——IO多路复用之select模块poll方法 使用poll方法实现IO多路复用 .├── poll_client.py├── poll_server.py└── settings.py ...

  5. java高级---->Thread之CompletionService的使用

    CompletionService的功能是以异步的方式一边生产新的任务,一边处理已完成任务的结果,这样可以将执行任务与处理任务分离开来进行处理.今天我们通过实例来学习一下CompletionServi ...

  6. 线程框架Executor的用法举例

    java5线程框架Executor的用法举例 Executor 是 java5 下的一个多任务并发执行框架(Doug Lea),可以建立一个类似数据库连接池的线程池来执行任务.这个框架主要由三个接口和 ...

  7. 线程池:Execution框架

    每问题每线程:在于它没有对已创建线程的数量进行任何限制,除非对客户端能够抛出的请求速率进行限制. 下边 有些图片看不到,清看原地址:http://www.360doc.com/content/10/1 ...

  8. Java并发编程核心方法与框架-CompletionService的使用

    接口CompletionService的功能是以异步的方式一边生产新的任务,一边处理已完成任务的结果,这样可以将执行任务与处理任务分离.使用submit()执行任务,使用take取得已完成的任务,并按 ...

  9. KafkaConsumer 长时间地在poll(long )方法中阻塞

    一,问题描述 搭建的用来测试的单节点Kafka集群(Zookeeper和Kafka Broker都在同一台Ubuntu上),在命令行下使用: ./bin/kafka-topics. --replica ...

随机推荐

  1. WIN7中 HttpListener 拒绝访问 异常解决 C#

      WIN7中 HttpListener 拒绝访问 异常解决 C# http://www.cnblogs.com/cmdszh/archive/2012/08/16/httplistener.html ...

  2. BT网站--Python开发爬虫代替.NET

    BT网站-奥修磁力-Python开发爬虫代替.NET写的爬虫,主要演示访问速度和在一千万左右的HASH记录中索引效率. IBMID 磁力下载- WWW.IBMID.COM  现在用的是Python + ...

  3. AngularJS 中ng-model通过$watch动态取值

    这个例子的意思是,当xxxx的长度不超过6时,xxxx和yyyy两个input的model是无关的,但当xxxx超过6,则yyyy会跟随其值而变化. 另一种做法是在input的ng-model后面添加 ...

  4. postgresql 的一些操作

    (4)常用数据库命令(mysql为MySQL数据库操作命令,psql为postgresql数据库命令) 手动重启数据库命令:pg_ctl -D /usr/local/var/postgres -l / ...

  5. 关于箭头函数的this指向问题

    document.onclick = function(){ // 普通函数的this是在运行的时候才临时绑定的,也就是说,函数不运行,你绝对不可能知道this是谁 // 下面这个函数如果是自调用,t ...

  6. layui table合计但是未计算的解决

    在项目里table开启合计功能,但是并未进行数据计算,后来发现是field写错了的问题,上代码 for(var i = 0; i < that.checkboxAll.data.length; ...

  7. oracle 备份恢复篇(二)---rman 增备恢复--不完全恢复

    一,环境准备 全备脚本: export TMP=/tmp export TMPDIR=$TMP export ORACLE_BASE=/u01 export ORACLE_SID=prod expor ...

  8. keepalived heartbeat lvs haproxy

    一, keeplived @ 01,keeplived 是什么? Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三.第四层.第五层交 ...

  9. java中的各种修饰符作用范围

    访问修饰符: private 缺省 protected public 作用范围: 访问修饰符\作用范围 所在类 同一包内其他类 其他包内子类 其他包内非子类 private 可以访问 不可以 不可以 ...

  10. JAVA 利用反射自定义数据层框架

    之前的随笔一直都在介绍c#,主要公司最近的业务都是做桌面程序,那么目前c#中的WPF肯定是我做桌面程序的不二之选,做了半年的WPF,也基本摸清了c#写代码的套路和规则(本人之前是两年多的JAVA开发者 ...