CompletableService
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的更多相关文章
随机推荐
- Apache ActiveMQ序列化漏洞(CVE-2015-5254)复现
Apache ActiveMQ序列化漏洞(CVE-2015-5254)复现 一.漏洞描述 该漏洞源于程序没有限制可在代理中序列化的类.远程攻击者可借助特制的序列化的java消息服务(JMS)Objec ...
- 死磕 java同步系列之ReentrantReadWriteLock源码解析
问题 (1)读写锁是什么? (2)读写锁具有哪些特性? (3)ReentrantReadWriteLock是怎么实现读写锁的? (4)如何使用ReentrantReadWriteLock实现高效安全的 ...
- C#上手练习5(GOTO语句)
C# goto 语句用于直接在一个程序中转到程序中的标签指定的位置,标签实际上由标识符加上冒号构成 语法形式如下. goto Labell; 语句块 1;Labell 语句块 2; 如果要 ...
- Linux软件安装——服务管理的命令
Linux软件安装——服务管理的命令 摘要:本文主要学习了Linux系统中服务管理的命令. service命令 service命令用于对系统服务进行管理,比如启动(start).停止(stop).重启 ...
- rocksdb和leveldb性能比较——写性能
前面学习了一下rocksdb,这个db是对leveldb的一个改进,是基于leveldb1.5的版本上的改进,而且leveldb1.5以后也在不断的优化,下面从写入性能对两者进行对比. 前言 比较的l ...
- MySQL 部署 MHA 高可用架构 (二)
实现 MHA VIP 功能 配置 master_ip_failover 脚本(db3) 把 master_ip_failover 上传到 /iba/software 上 master_ip_failo ...
- WindowsServer2003中IIS支持php的配置
1.安装MySQL(没有特殊说明的就按照默认安装)选择 Custom 自定义安装点击"Change"更改 MySQL 安装目录(自定义)其他按照默认的下一步就可以 安装完成后会自动 ...
- Python 修饰符@用法
def funA(desA): print("It's funA") def funB(desB): print(desB( )) print("It's funB&qu ...
- 12Java基础_数组定义格式/动态初始化/静态初始化
/* Java数组 格式一: int[] array; 格式二: int array[]; 数组初始化: 为数组中的元素分配内存空间 动态初始化: int[] array=new int[数组长度] ...
- 5、zabbix数据库分离
环境: zabbix端:zabbix3.4(192.168.80.66) 数据库端:mysql5.7(192.168.80.88) 被监控端:web01(192.168.80.240) 为什么要将数据 ...