首页 > 解决方案 > CompletableFuture 在 forloop 中被创建和等待

问题描述

我正在尝试遍历一堆文件并使用长时间运行的任务来处理它们。使用CompletableFuture.allOf(a, b)我可以在日志中看到两个线程处理同一个文件,而不是每个线程一个。

private void fileScan() {
    final Set<Video> videos = videoService.findAllVideoFiles();

    for (Video video : videos) {
        final CompletableFuture<Thumbnail> cover = thumbnailService.createCover(video);
        final CompletableFuture<List<Thumbnail>> thumbnails = thumbnailService.createThumbnails(video);

        CompletableFuture.allOf(cover, thumbnails);

        try {
            video.setCover(cover.get());
            video.setThumbnails(thumbnails.get());

            videoRepository.save(video);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}

Set由_Set<File> files = ConcurrentHashMap.newKeySet();

并且处理方法设置为@Async但日志显示

 START >> Thread thumbnail_thread_1 >> Video Dogs.mp4
 START >> Thread thumbnail_thread_2 >> Video Dogs.mp4
 END >> Thread thumbnail_thread_2 >> Video Dogs.mp4
 END >> Thread thumbnail_thread_1 >> Video Dogs.mp4
 START >> Thread thumbnail_thread_3 >> Video Cats.mp4
 START >> Thread thumbnail_thread_4 >> Video Cats.mp4
 END >> Thread thumbnail_thread_3 >> Video Cats.mp4
 END >> Thread thumbnail_thread_4 >> Video Cats.mp4

有没有我错过的正确模式,或者我的日志不能被信任?

标签: javaasynchronouscompletable-future

解决方案


推荐阅读