1、future使用
public class FutureDemo {
private static Logger logger = LoggerFactory.getLogger(FutureDemo.class);
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask futureTask = new FutureTask(()->{
logger.info("futureTask ->callable 执行!!!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
},"返回任务结果");
new Thread(futureTask).start();
System.out.println(futureTask.get());
}
}
2、CompletionService
import java.util.concurrent.*;
public class CompletionServiceDemo {
private static ThreadPoolExecutor threadPoolExecutor =
new ThreadPoolExecutor(10,20,10, TimeUnit.SECONDS,new LinkedBlockingQueue<>());
public static void main(String[] args) throws InterruptedException, ExecutionException {
CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>(threadPoolExecutor);
completionService.submit(()->{
try {
Thread.sleep(800);
} catch (InterruptedException e) {
e.printStackTrace();
}
},800);
completionService.submit(()->{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
},1000);
completionService.submit(()->{
try {
Thread.sleep(15000);
} catch (InterruptedException e) {
e.printStackTrace();
}
},1500);
for (int i = 0; i < 3; i++) {
Integer integer = completionService.take().get();
System.out.println(integer);
}
threadPoolExecutor.shutdown();
}
}
3、CompletableFuture 简单使用
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.CompletableFuture;
public class CompletableFutureDemo {
private static ThreadPoolTaskExecutor threadPoolTaskExecutor;
static {
threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(10);
threadPoolTaskExecutor.setMaxPoolSize(10);
threadPoolTaskExecutor.setThreadNamePrefix("CompletableFutureDemo-");
threadPoolTaskExecutor.setQueueCapacity(1000);
threadPoolTaskExecutor.setKeepAliveSeconds(60);
threadPoolTaskExecutor.initialize();
}
private static Logger logger = LoggerFactory.getLogger(CompletableFutureDemo.class);
public static void main(String[] args) {
CompletableFuture<Void> voidCompletableFuture = CompletableFuture.runAsync(() -> {
logger.info("异步没有返回值!!");
},threadPoolTaskExecutor);
CompletableFuture<String> stringCompletableFuture = CompletableFuture.supplyAsync(() -> {
logger.info("异步有返回值!!");
return "aaaa";
}, threadPoolTaskExecutor);
logger.info("异步返回值[{}]",stringCompletableFuture.join());
threadPoolTaskExecutor.shutdown();
}
4、CompletableFuture 执行完成后执行(whenComplete()或 whenCompleteAsync())
package com.example.jucdemo.future;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.CompletableFuture;
import java.util.function.BiConsumer;
public class CompletableFutureDemo {
private static ThreadPoolTaskExecutor threadPoolTaskExecutor;
static {
threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(10);
threadPoolTaskExecutor.setMaxPoolSize(10);
threadPoolTaskExecutor.setThreadNamePrefix("CompletableFutureDemo-");
threadPoolTaskExecutor.setQueueCapacity(1000);
threadPoolTaskExecutor.setKeepAliveSeconds(60);
threadPoolTaskExecutor.initialize();
}
private static Logger logger = LoggerFactory.getLogger(CompletableFutureDemo.class);
public static void main(String[] args) {
CompletableFuture<Void> voidCompletableFuture = CompletableFuture.runAsync(() -> {
logger.info("异步没有返回值!!");
},threadPoolTaskExecutor);
CompletableFuture<String> stringCompletableFuture = CompletableFuture.supplyAsync(() -> {
logger.info("异步有返回值!!");
return "aaaa";
}, threadPoolTaskExecutor);
stringCompletableFuture.whenCompleteAsync(new BiConsumer<String, Throwable>() {
@Override
public void accept(String s, Throwable throwable) {
logger.info("supplyAsync执行完成后获取返回值[{}]",s);
}
},threadPoolTaskExecutor);
stringCompletableFuture.whenComplete(new BiConsumer<String, Throwable>() {
@Override
public void accept(String s, Throwable throwable) {
logger.info("supplyAsync执行完成后获取返回值[{}]",s);
}
});
logger.info("异步返回值[{}]",stringCompletableFuture.join());
threadPoolTaskExecutor.shutdown();
}
}
5、CompletableFuture 执行抛异常执行
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.function.BiConsumer;
import java.util.function.Function;
public class CompletableFutureDemo {
private static ThreadPoolTaskExecutor threadPoolTaskExecutor;
static {
threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(10);
threadPoolTaskExecutor.setMaxPoolSize(10);
threadPoolTaskExecutor.setThreadNamePrefix("CompletableFutureDemo-");
threadPoolTaskExecutor.setQueueCapacity(1000);
threadPoolTaskExecutor.setKeepAliveSeconds(60);
threadPoolTaskExecutor.initialize();
}
private static Logger logger = LoggerFactory.getLogger(CompletableFutureDemo.class);
public static void main(String[] args) {
CompletableFuture<String> stringCompletableFuture = CompletableFuture.supplyAsync(() -> {
logger.info("异步有返回值!!");
List list = null;
list.add("1");
return "aaaa";
}, threadPoolTaskExecutor);
stringCompletableFuture.whenComplete(new BiConsumer<String, Throwable>() {
@Override
public void accept(String s, Throwable throwable) {
logger.info("supplyAsync执行完成后获取返回值[{}]",s);
}
});
CompletableFuture<String> exceptionally = stringCompletableFuture.exceptionally(new Function<Throwable, String>() {
@Override
public String apply(Throwable throwable) {
logger.info("异常【{}】", throwable.getMessage());
return throwable.getMessage();
}
});
logger.info("异常返回值[{}]",exceptionally.join());
logger.info("异步返回值[{}]",stringCompletableFuture.join());
threadPoolTaskExecutor.shutdown();
}
6、CompletableFuture上一个执行完成的返回值作为下一个的入参(thenApply()/thenApplyAsync())
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.CompletableFuture;
public class CompletableFutureDemo1 {
private static ThreadPoolTaskExecutor threadPoolTaskExecutor;
static {
threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(10);
threadPoolTaskExecutor.setMaxPoolSize(10);
threadPoolTaskExecutor.setThreadNamePrefix("CompletableFutureDemo-");
threadPoolTaskExecutor.setQueueCapacity(1000);
threadPoolTaskExecutor.setKeepAliveSeconds(60);
threadPoolTaskExecutor.initialize();
}
private static Logger logger = LoggerFactory.getLogger(CompletableFutureDemo1.class);
public static void main(String[] args) {
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
logger.info("异步有返回值!!");
return "Hello";
}, threadPoolTaskExecutor).thenApply(h->{
return h + "World";
});
logger.info("{}",completableFuture.join());
CompletableFuture<String> async = CompletableFuture.supplyAsync(() -> {
logger.info("异步有返回值2!!");
return "Hello";
}, threadPoolTaskExecutor).thenApplyAsync(h->{
return h + "World";
},threadPoolTaskExecutor);
logger.info("{}",async.join());
threadPoolTaskExecutor.shutdown();
}
}
7、thenCombine() 任务合并
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class CompletableFutureDemo {
private static Logger logger = LoggerFactory.getLogger(CompletableFutureDemo.class);
private static ThreadPoolTaskExecutor threadPoolTaskExecutor;
static {
threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(10);
threadPoolTaskExecutor.setMaxPoolSize(10);
threadPoolTaskExecutor.setThreadNamePrefix("CompletableFutureDemo-");
threadPoolTaskExecutor.setQueueCapacity(1000);
threadPoolTaskExecutor.setKeepAliveSeconds(60);
threadPoolTaskExecutor.initialize();
}
public static void main(String[] args) {
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
logger.info("异步有返回值!!");
return "Hello";
}, threadPoolTaskExecutor).thenApply(h->{
return h + "World!";
}).thenCombine(CompletableFuture.supplyAsync(() -> {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "你好 世界";
},threadPoolTaskExecutor),(z,e)->{
return z + e;
});
logger.info("{}",completableFuture.join());
threadPoolTaskExecutor.shutdown();
}
}
8、applyToEitherAsync() 异步 哪个先执行完成,就用哪个结果
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.CompletableFuture;
public class CompletableFutureDemo {
private static Logger logger = LoggerFactory.getLogger(CompletableFutureDemo.class);
private static ThreadPoolTaskExecutor threadPoolTaskExecutor;
static {
threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(10);
threadPoolTaskExecutor.setMaxPoolSize(10);
threadPoolTaskExecutor.setThreadNamePrefix("CompletableFutureDemo-");
threadPoolTaskExecutor.setQueueCapacity(1000);
threadPoolTaskExecutor.setKeepAliveSeconds(60);
threadPoolTaskExecutor.initialize();
}
public static void main(String[] args) {
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
logger.info("111公交车正在赶来");
return "111公交车到了";
}, threadPoolTaskExecutor)
.applyToEither(CompletableFuture.supplyAsync(() -> {
logger.info("222公交车正在赶来");
return "222公交车到了";
}, threadPoolTaskExecutor), (s) -> {
if (s.startsWith("111")) {
logger.info("111公交车到了");
}
if (s.startsWith("222")) {
logger.info("222公交车到了");
}
return s;
});
threadPoolTaskExecutor.shutdown();
}
}
9、thenAccept() | thenAcceptAsync()没有返回结果的 在thenAccept中获取上一个参数直接使用
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.CompletableFuture;
public class CompletableFutureDemo {
private static Logger logger = LoggerFactory.getLogger(CompletableFutureDemo.class);
private static ThreadPoolTaskExecutor threadPoolTaskExecutor;
static {
threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(10);
threadPoolTaskExecutor.setMaxPoolSize(10);
threadPoolTaskExecutor.setThreadNamePrefix("CompletableFutureDemo-");
threadPoolTaskExecutor.setQueueCapacity(1000);
threadPoolTaskExecutor.setKeepAliveSeconds(60);
threadPoolTaskExecutor.initialize();
}
public static void main(String[] args) {
CompletableFuture<Void> completableFuture = CompletableFuture.supplyAsync(() -> {
int a = 2;
logger.info("第一个值:{}", a);
return a;
}, threadPoolTaskExecutor).thenAccept(s -> {
logger.info("倍数:{}", s * s);
});
CompletableFuture<Void> completableFutureAsync = CompletableFuture.supplyAsync(() -> {
int a = 2;
logger.info("第一个值:{}", a);
return a;
}, threadPoolTaskExecutor)
.thenAcceptAsync(s -> {
logger.info("倍数:{}", s * s);
}, threadPoolTaskExecutor);
}
}
10、thenAcceptBoth|thenAcceptBothAsync() 对2个CompletableFuture的结果进行操作
package com.example.jucdemo.future;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.CompletableFuture;
public class CompletableFutureDemo {
private static Logger logger = LoggerFactory.getLogger(CompletableFutureDemo.class);
private static ThreadPoolTaskExecutor threadPoolTaskExecutor;
static {
threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(10);
threadPoolTaskExecutor.setMaxPoolSize(10);
threadPoolTaskExecutor.setThreadNamePrefix("CompletableFutureDemo-");
threadPoolTaskExecutor.setQueueCapacity(1000);
threadPoolTaskExecutor.setKeepAliveSeconds(60);
threadPoolTaskExecutor.initialize();
}
public static void main(String[] args) {
CompletableFuture<Integer> integerCompletableFuture1 = CompletableFuture.supplyAsync(() -> {
int a = 2;
logger.info("第一个值:{}", a);
return a;
}, threadPoolTaskExecutor);
CompletableFuture<Integer> integerCompletableFuture2 = CompletableFuture.supplyAsync(() -> {
int a = 3;
logger.info("第二个值:{}", a);
return a;
}, threadPoolTaskExecutor);
integerCompletableFuture1.thenAcceptBothAsync(integerCompletableFuture2, (s1, s2) -> {
logger.info("求和:{}", s1 + s2);
}, threadPoolTaskExecutor);
threadPoolTaskExecutor.shutdown();
}
}
11、anyOf() 有一个返回即可
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.CompletableFuture;
public class CompletableFutureDemo {
private static Logger logger = LoggerFactory.getLogger(CompletableFutureDemo.class);
private static ThreadPoolTaskExecutor threadPoolTaskExecutor;
static {
threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(10);
threadPoolTaskExecutor.setMaxPoolSize(10);
threadPoolTaskExecutor.setThreadNamePrefix("CompletableFutureDemo-");
threadPoolTaskExecutor.setQueueCapacity(1000);
threadPoolTaskExecutor.setKeepAliveSeconds(60);
threadPoolTaskExecutor.initialize();
}
public static void main(String[] args) {
CompletableFuture<String> completableFuture1 = CompletableFuture.supplyAsync(() -> {
return "Hello";
}, threadPoolTaskExecutor);
CompletableFuture<String> completableFuture2 = CompletableFuture.supplyAsync(() -> {
return "World";
}, threadPoolTaskExecutor);
CompletableFuture<Object> result = CompletableFuture.anyOf(completableFuture1,
completableFuture2);
logger.info("result:{}", result.join());
threadPoolTaskExecutor.shutdown();
}
}
12、allOf() 全部执行完
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.CompletableFuture;
public class CompletableFutureDemo {
private static Logger logger = LoggerFactory.getLogger(CompletableFutureDemo.class);
private static ThreadPoolTaskExecutor threadPoolTaskExecutor;
static {
threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(10);
threadPoolTaskExecutor.setMaxPoolSize(10);
threadPoolTaskExecutor.setThreadNamePrefix("CompletableFutureDemo-");
threadPoolTaskExecutor.setQueueCapacity(1000);
threadPoolTaskExecutor.setKeepAliveSeconds(60);
threadPoolTaskExecutor.initialize();
}
public static void main(String[] args) {
CompletableFuture<String> completableFuture1 = CompletableFuture.supplyAsync(() -> {
return "Hello";
}, threadPoolTaskExecutor);
CompletableFuture<String> completableFuture2 = CompletableFuture.supplyAsync(() -> {
return "World";
}, threadPoolTaskExecutor);
CompletableFuture<Void> voidCompletableFuture = CompletableFuture.allOf(completableFuture1, completableFuture2);
logger.info("completableFuture1:{},completableFuture2:{}",completableFuture1.isDone(),completableFuture2.isDone());
threadPoolTaskExecutor.shutdown();
}
}