美文网首页
问题:如何给ExecutorService分配任务

问题:如何给ExecutorService分配任务

作者: Dream_Lin | 来源:发表于2019-01-22 16:47 被阅读6次

问题

如何给ExecutorService分配任务

答案

给ExecutorService分配任务

ExecuteService可以执行Runnable任务,也可以执行Callable任务.ExecutorService有很多方法可以执行任务,包括execute()(从Executor接口继承),还有submit(),invokeAny(),invokeAll().

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Runnable runnableTask = () -> {
            System.out.println("run task");
        };

        Callable<String> callableTask = () -> {
            System.out.println("callable task");
            return "callable task return value";
        };
        List<Callable<String>> callableTasks = new ArrayList<>();
        callableTasks.add(callableTask);
        callableTasks.add(callableTask);
        callableTasks.add(callableTask);

        ExecutorService executorService = Executors.newFixedThreadPool(10);

        //execute()方法
        executorService.execute(runnableTask);

        //submit()方法
        Future<String> future = executorService.submit(callableTask);
        System.out.println("submit result:" + future.get());

        //invokeAny()方法
        String invokeAnyResult = null;
        try {
            invokeAnyResult = executorService.invokeAny(callableTasks);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("invokeAny result:" + invokeAnyResult);

        //invokeAll()方法
        List<Future<String>> invokeAllResultList = Arrays.asList();
        try {
            invokeAllResultList = executorService.invokeAll(callableTasks);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        for (int i = 0; i < invokeAllResultList.size(); i++) {
            System.out.println("invokeAllResult" + " " + i + ":" + invokeAllResultList.get(i).get());
        }


    }
}

  • execute方法没有返回值,只能执行Runnable任务,它无法获取任务的执行结果和获取任务的执行状态.
executorService.execute(runnableTask);
  • submit方法可以提交一个Runnable任务或者一个Callable任务,返回一个Future类型的结果,可以通过调用Future.get()方法获取返回值.
 Future<String> future = executorService.submit(callableTask);
 System.out.println("submit result:" + future.get());
  • invokeAny方法提交一个Callable任务集合,每个任务都会被执行,返回其中一个执行成功的任务的返回值(如果有一个任务成功被执行).
        String invokeAnyResult = null;
        try {
            invokeAnyResult = executorService.invokeAny(callableTasks);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("invokeAny result:" + invokeAnyResult);

  • invokeAll方法提交一个Callable任务集合,每个任务都会被执行,返回一个Future列表,遍历Future可以获取每个方法的返回值.
 List<Future<String>> invokeAllResultList = Arrays.asList();
        try {
            invokeAllResultList = executorService.invokeAll(callableTasks);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        for (int i = 0; i < invokeAllResultList.size(); i++) {
            System.out.println("invokeAllResult" + " " + i + ":" + invokeAllResultList.get(i).get());
        }

相关文章

网友评论

      本文标题:问题:如何给ExecutorService分配任务

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