package com.sleep.demo;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
public class MyTest {
private static final ThreadPoolExecutor PRODUCT_EXECUTOR = new ThreadPoolExecutor(
2, 2, 30, TimeUnit.MINUTES, new SynchronousQueue<>(), new ThreadFactory() {
private final AtomicInteger count = new AtomicInteger(0);
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
thread.setDaemon(true);
thread.setPriority(Thread.NORM_PRIORITY);
thread.setName("CommonProductVoConverter-" + count.incrementAndGet());
return thread;
}
}, new ThreadPoolExecutor.CallerRunsPolicy());
public static void main(String[] args) {
List<Long> productAlls = new ArrayList<>();
productAlls.add(1L);
productAlls.add(5L);
productAlls.add(2L);
productAlls.add(3L);
productAlls.add(4L);
Random random = new Random();
List<CompletableFuture<String>> futures = productAlls.stream()
.map(each -> CompletableFuture.supplyAsync(() -> {
try {
long i = random.nextInt(1000);
System.out.println("random:"+i);
Thread.sleep(i);
return each+"";
} catch (Exception e) {
System.out.println("convert product error"+ e);
// Profiler.businessAlarm("CommonProductVOConverter#convert", "convert product error: " + JsonUtils.toJson(each.getProduct()));
return null;
}
}, PRODUCT_EXECUTOR))
.collect(Collectors.toList());
try {
CompletableFuture.anyOf(futures.toArray(new CompletableFuture[0]))
.get(1, TimeUnit.SECONDS);
//CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).get(1 , TimeUnit.SECONDS);
} catch (Exception e) {
throw new RuntimeException("thread pool execute timeout", e);
}
for (CompletableFuture<String> future : futures) {
String now = future.getNow(null);
System.out.println("result:"+now);
}
}
}