美文网首页
JUC 假设现在有10个任务,要求同时处理,并且必须所有任务全部

JUC 假设现在有10个任务,要求同时处理,并且必须所有任务全部

作者: 尹楷楷 | 来源:发表于2021-05-14 10:21 被阅读0次

方法1、executorService.submit+Callable+FutureTask实现
FutureTask.get()实现主线程阻塞

import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;

public class TenTask {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        ExecutorService executorService = Executors.newFixedThreadPool(10);
        ArrayList<Future> futures = new ArrayList<>(10);

        for (int i = 0; i < 10; i++) {
            int finalI = i;
            Future<?> submit = executorService.submit(new Callable<Object>() {
                @Override
                public Object call() throws Exception {
                    System.out.println(String.format("TASK %s 执行", finalI));
                    return 100-finalI;
                }

            });
            futures.add(submit);

        }

        Integer number =0;
        for (Future future : futures) {
            number = number + (Integer) future.get();
        }

        System.out.println(number);
    }

}

方法2、executorService.execute+Runnable+CountDownLatch
countDownLatch.await() 实现主线程阻塞

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

public class TenTask {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        CountDownLatch countDownLatch = new CountDownLatch(10);
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        AtomicInteger atomicInteger = new AtomicInteger(0);

        for (int i = 0; i < 10; i++) {
            int finalI = i;
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(String.format("TASK %s 执行", finalI));
                    atomicInteger.addAndGet((100 - finalI));
                    countDownLatch.countDown();
                }
            });
        }
        countDownLatch.await();
        System.out.println(atomicInteger);
    }


}


方法3、CompletableFuture + Supplier

completableFuture.get()实现阻塞

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Supplier;

public class Main {

    public static void main(String[] args) throws Exception {

        AtomicInteger atomicInteger = new AtomicInteger(0);
        List<Future> futureList = new ArrayList<>(10);

        for (int i = 0; i < 10; i++) {
            int finalI = i;
            CompletableFuture<Integer> f = CompletableFuture
                .supplyAsync(new Supplier<Integer>() {
                    @Override
                    public Integer get() {
                        System.out.println(String.format("TASK %s 执行", finalI));
                        return 100 - finalI;
                    }
                });
            futureList.add(f);
        }

        for (Future future : futureList) {
            atomicInteger.addAndGet((Integer) future.get());
        }
        System.out.println(atomicInteger);
    }

}

相关文章

  • JUC 假设现在有10个任务,要求同时处理,并且必须所有任务全部

    方法1、executorService.submit+Callable+FutureTask实现FutureTas...

  • 双核处理

    问题描述 一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的...

  • 双核处理-python

    题目: 一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每...

  • 背包问题

    一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒...

  • [编程题] 双核处理

    一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒...

  • 2018网易春招笔试

    1.一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核...

  • Go 采用 goroutine 和 channel 实现工作池

    假设有一组任务需要异步处理且量很大,那我们需要同时开启多个 worker 以保证任务的处理速度而不会堵塞任务。其他...

  • Go 采用 goroutine 和 channel 实现工作池

    假设有一组任务需要异步处理且量很大,那我们需要同时开启多个 worker 以保证任务的处理速度而不会堵塞任务。其他...

  • Promise.all 处理error

    Promise.all()接受一个由promise任务组成的数组,可以同时处理多个promise任务,当所有的任务...

  • Python多线程

    多线程基础概念 并行与并发 并行:同时处理多个任务,必须在多核环境下 一段时间内同时处理多个任务,单核也可以并发 ...

网友评论

      本文标题:JUC 假设现在有10个任务,要求同时处理,并且必须所有任务全部

      本文链接:https://www.haomeiwen.com/subject/aaxxjltx.html