public class CompletableServiceTest { 

    public static void main(String[] args) throws ExecutionException, InterruptedException {

//      test1();

//      test2();

        test3();
} //这种方式提交的任务,有可能任务A是第一个执行完的,但是返回的顺序却不是第一个
public static void test1() throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool();
List<Callable> task = IntStream.range(, ).boxed().map(CompletableServiceTest::toTask).collect(Collectors.toList());
List<Future<String>> futures = new ArrayList<>();
task.forEach(r -> futures.add(executorService.submit(r))); System.out.println(futures.get().get());
System.out.println("======4======"); System.out.println(futures.get().get());
System.out.println("======3======");
} //这种方式可以保证假如任务A是第一个执行完的,那么他也是第一个返回的
public static void test2() throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool();
List<Callable> task = IntStream.range(, ).boxed().map(CompletableServiceTest::toTask).collect(Collectors.toList());
CompletionService completionService = new ExecutorCompletionService(executorService);
task.forEach(r -> completionService.submit(r));
Future<?> future = null;
while ((future = completionService.take()) != null){
System.out.println(future.get());
} } //由于调用线程池的shutdownNow方法,可能正在执行的任务被中断后,任务的状态丢失。该任务不包含在shutdownNow的返回值中
//解决的办法是在任务里定义一个状态,表示是否完成
public static void test3() throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool();
List<Callable> task = IntStream.range(, ).boxed().map(MyTask::new).collect(Collectors.toList());
task.forEach(r -> executorService.submit(r));
TimeUnit.SECONDS.sleep();
executorService.shutdownNow(); //这里虽然返回了未执行完的任务,但是不可性
//由于调用shutdownNow方法,任务被中断没有成功执行完的任务
task.stream().filter(c-> !((MyTask)c).isSuccess()).forEach(c->{System.out.println("task value : " +((MyTask) c).value);}); } public static class MyTask implements Callable<String>{
private final Integer value;
private boolean success = false;
MyTask(int value){
this.value = value;
} @Override
public String call() throws Exception {
System.out.println("task [" + value +"] will be executed");
TimeUnit.SECONDS.sleep(value*+);
System.out.println("task [" + value +"] executes done");
success = true;
return "task result - "+ value;
} public boolean isSuccess(){
return success;
}
} private static Callable<String> toTask(int i){
return ( ) ->{
try {
System.out.println("task [" + i +"] will be executed");
TimeUnit.SECONDS.sleep(i*+);
System.out.println("task [" + i +"] executes done");
return "task result - "+ i;
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}; }
}

CompletableService的更多相关文章

随机推荐

  1. Long Jumps CodeForces - 479D

    E - Long Jumps CodeForces - 479D Valery is a PE teacher at a school in Berland. Soon the students ar ...

  2. 【转】Oracle重置序列(不删除重建方式)

    Oracle中一般将自增sequence重置为初始1时,都是删除再重建,这种方式有很多弊端,依赖它的函数和存储过程将失效,需要重新编译.不过还有种巧妙的方式,不用删除,利用步长参数,先查出sequen ...

  3. Python数据分析揭秘知乎大V的小秘密

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 清风小筑 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...

  4. 我用python爬取了知乎Top沙雕问题排行榜

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 数据森麟 PS:如有需要Python学习资料的小伙伴可以加点击下方 ...

  5. printf打印字节调试

    void print(BYTE *data, INT len) { INT x = 0; INT y = 0; if(data == NULL) { return; } for(x = 0; x &l ...

  6. netcore之RabbitMQ入门

    简介 RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息中间件,基于Erlang语言编写. AMQP是什么 AMQP 0-9-1(高级消息队列协议)是一种消息传递协议,它允许一致的客户端应 ...

  7. 函数的名称空间,函数的嵌套(global, nonlocal),函数名的运用

    一 函数的名称空间 内置空间:存放python解释器内置函数的空间 全局空间:py文件运行时开辟的,存放的是执行的py文件(出去函数内部)的所有的变量与值的对用关系,整个py文件结束后才会消失. 局部 ...

  8. Vim基础配置

    vim 个性化设置 安装插件管理器Vundle: 创建目录: mkdir -p ~/.vim/bundle 下载文件: git clone https://github.com/VundleVim/V ...

  9. golang数据结构和算法之StackArray数组堆栈

    用数组实现的堆栈, 另一种,是用链表实现的堆栈, 在各种不同的编程语言上, 实现都是类似的. StackArray.go package StackArray //基于数组实现的堆栈 const ar ...

  10. day82_10_31celery的使用

    1.缓存 当一些数据需要固定地且频繁访问数据库时,需要使用到接口缓存. 以轮播图为例,每个用户都会访问首页,首页的轮播图长时间不会改变,所以可以使用cache,将固定数据保存到缓存中(redis),第 ...