使用多线程Parallellize一个用于Java循环

Jhutan Debnath说:

我很新的Java和我想并行嵌套使用执行服务或在Java中使用任何其他方法循环。我想创建线程的一些固定的数量,使得CPU没有完全被线程收购。

    for(SellerNames sellerNames : sellerDataList) {
        for(String selleName : sellerNames) {
        //getSellerAddress(sellerName)
        //parallize this task
        }
    }

sellerDataList的大小= 1000和大小sellerNames = 5000的。

现在,我想创建10个线程和任务的平等块同样分配给每个线程。这是第i个sellerDataList,第一个线程应该得到的地址为500名,第二个线程应该得到地址,接下来的500名等。
什么是做好这项工作的最佳方式?

塔马斯修订:

有两种方法,使其运行并行:流和执行人。

使用流

您可以使用并行流,其余的事情到JVM。在这种情况下,你不必在何时会发生什么太多的控制权。在另一方面你的代码将很容易阅读和维护:

    sellerDataList.stream().forEach(sellerNames -> {
        Stream<String> stream = StreamSupport.stream(sellerNames.spliterator(), true); // true means use parallel stream
        stream.forEach(sellerName -> {
            getSellerAddress(sellerName);
        });
    });

使用一个ExecutorService

假设,你要5个话题,你希望能够等到任务完成。然后你可以使用一个固定的线程池有5个线程和使用Future-s这样你就可以等待,直到他们完成。

    final ExecutorService executor = Executors.newFixedThreadPool(5); // it's just an arbitrary number
    final List<Future<?>> futures = new ArrayList<>();
    for (SellerNames sellerNames : sellerDataList) {
        for (final String sellerName : sellerNames) {
            Future<?> future = executor.submit(() -> {
                getSellerAddress(sellerName);
            });
            futures.add(future);
        }
    }
    try {
        for (Future<?> future : futures) {
            future.get(); // do anything you need, e.g. isDone(), ...
        }
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章