CompletableFuture的异步批量

@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
public class TimeLimitedTransJobTest {
    private static ExecutorService TIME_LIMITED_SEND_BACK_THREAD_POOL = new ThreadPoolExecutor(16, 16,
            60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(5000));

    @Test
    public void test() {
        CompletableFuture[] futures = IntStream.range(1, 10)
                .mapToObj(this::syncSendByBackPartner)
                .toArray(CompletableFuture[]::new);
        CompletableFuture<Void> future = CompletableFuture.allOf(futures);
        try {
            future.get();
            log.debug("all done");
        } catch (Exception e) {
            log.error("syncSendByBackPartner exception", e);
        }
    }

    private CompletableFuture<Void> syncSendByBackPartner(int i) {
        return CompletableFuture.runAsync(() -> {
            sendBackPartner(i);
        }, TIME_LIMITED_SEND_BACK_THREAD_POOL);
    }

    private void sendBackPartner(int i) {
        log.info("do something for num {}...", i);
        try {
            Thread.sleep(RandomUtils.nextInt(100, 500));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("num {} done", i);
    }
}

参考:https://blog.csdn.net/icool_ali/article/details/80910310 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java CompletableFuture 是 Java 8 引入的一个功能强大的工具,它提供了一种非阻塞式的异步编程模型,适合处理并发任务。如果你想批量裁剪图片并利用CompletableFuture,可以按照以下步骤操作: 1. 首先,导入必要的库: ```java import java.util.concurrent.CompletableFuture; import java.util.List; import java.util.stream.Collectors; import com.amazonaws.imageio.ImageIO; // 如果你需要使用Amazon S3等外部资源,可能需要此库 ``` 2. 定义一个用于裁剪图片的方法,这里假设我们使用 `Apache Commons Imaging` 或类似库来处理: ```java public CompletableFuture<String> cropImage(String imagePath) { return CompletableFuture.supplyAsync(() -> { try { // 图片裁剪逻辑 BufferedImage image = ImageIO.read(new File(imagePath)); // 裁剪代码... // 返回裁剪后的图片路径或base64编码 return "cropped_image_path"; } catch (IOException e) { throw new RuntimeException("Error cropping image", e); } }); } ``` 3. 对于批量裁剪,你可以创建一个列表包含所有需要裁剪的图片路径,然后使用 `thenApplyToList` 来批量处理并收集结果到一个 List 中: ```java List<String> imagePaths = ... // 你的图片路径列表 CompletableFuture.allOf( imagePaths.stream() .map(this::cropImage) .toArray(CompletableFuture[]::new)) // 并发处理 .thenApplyToList(completedFutures -> { List<String> croppedImages = completedFutures.stream() .map(CompletableFuture::join) .collect(Collectors.toList()); return croppedImages; }); ``` 4. 最后,使用 `.join()` 等待所有操作完成。 注意,这只是一个基本示例,实际应用可能需要考虑错误处理、线程池管理以及性能优化(比如批处理数量)等因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值