ExecutorService的使用方法

ExecutorService的使用方法

ExecutorService介绍

ExecutorService是java.util.concurrent包下的一个接口,作为一个线程池接口,主要负责任务执行管理。
ExecutorService方法
Java API对ExecutorService接口的具体实现类主要有三个,如下所示:

  • ThreadPoolExecutor
  • ForkJoinPool
  • ScheduledThreadPoolExecutor

主要UML图如下所示
ExecutorService结构UML图

ExecutorService创建

我们创建ExecutorService时一般是直接通过java提供的工具类Executors工厂类进行创建。而Executors工厂类一共提供了下列方法区创建线程池。

1. newFixedThreadPool
2. newWorkStealingPool
3. newSingleThreadExecutor
4. newCachedThreadPool
5. newSingleThreadScheduledExecutor
6. newScheduledThreadPool

  • newFixedThreadPool
    创建一个线程数量固定的线程池
  • newWorkStealingPool
    返回一个使用所有可用处理器作为目标并行度的ForkJoinPool线程池
  • newSingleThreadExecutor
    创建一个单线程线程池
  • newCachedThreadPool
    创建一个可缓存的线程池,需要时创建线程,不需要则销毁
  • newSingleThreadScheduledExecutor
    创建一个单线程定时执行器(ScheduledExecutorService)
  • newScheduledThreadPool
    创建一个定时执行器

ExecutorService的使用

ExecutorService提供任务时可以提交Runnable与Callable来执行任务并返回Future用于接受Callable中返回的数据,

submit(Callable callable)

提交Callable

ExecutorService executorService = Executors.newSingleThreadExecutor();
  Future<String> submit = executorService.submit(() -> {
      TimeUtils.sleepMilliSecond(1000);// 自定义工具类
      return "abs";
  });
  submit.get(100, TimeUnit.MILLISECONDS);// 获取Callable返回的对象,如果在指定时间内没有返回成功则抛出异常.
  submit.get();// 获取Callable返回的对象,直到Callable成功返回,否则堵塞.

submit(Runnable run)

提交Runnable

ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(() -> {
 LogUtils.info("执行Runnable");
});

invokeAny

执行Callable列表,当存在一个线程执行完毕并返回结果时,invokeAny执行结束并返回结果.

ExecutorService executorService = Executors.newCachedThreadPool();
List<Callable<String>> callables = new ArrayList<>();
callables.add(() -> {
 TimeUtils.sleepMilliSecond(RandomUtils.nextInt(0, 1000));
 return "a";
});
callables.add(() -> {
 TimeUtils.sleepMilliSecond(RandomUtils.nextInt(0, 1000));
 return "b";
});
callables.add(() -> {
 TimeUtils.sleepMilliSecond(RandomUtils.nextInt(0, 1000));
 return "c";
});
String s = executorService.invokeAny(callables);
LogUtils.info("s = {}", s);

invokeAll

执行Callable列表,并在任务执行完毕后返回future列表用于获取信息

ExecutorService executorService = Executors.newCachedThreadPool();
  List<Callable<String>> callables = new ArrayList<>();
  callables.add(() -> {
      TimeUtils.sleepMilliSecond(RandomUtils.nextInt(0, 1000));
      return "a";
  });
  callables.add(() -> {
      TimeUtils.sleepMilliSecond(RandomUtils.nextInt(0, 1000));
      return "b";
  });
  callables.add(() -> {
      TimeUtils.sleepMilliSecond(RandomUtils.nextInt(0, 1000));
      return "c";
  });
  List<Future<String>> futures = executorService.invokeAll(callables);
  for (Future<String> future : futures) {
      String s = future.get();
      LogUtils.info("s = {}", s);
  }

shutdown

等待线程池中所有任务结束然后停止

shutdownNow

立即停止线程池

isShutdown

判定线程池是否被停止

isTerminated

判定线程池任务是否结束

awaitTermination

当调用了awaitTermination后有一下一种状态.

1. 没有超时,并且子线程执行完,此时返回true
2. 没有超时,但子线程没有执行完,此时返回false
3. 超时,此时返回false

在执行awaitTermination前需要执行shutdown方法,否则awaitTermination一定超时并且返回false


ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(() -> {
  LogUtils.info(Thread.currentThread().getName());
  TimeUtils.sleepMilliSecond(RandomUtils.nextInt(0, 1000));
});
executorService.shutdown();
LogUtils.info("开始等待");
boolean b = executorService.awaitTermination(3, TimeUnit.SECONDS);
LogUtils.info("等待完毕");
if(b){
  LogUtils.info("分线程已经结束");
}
LogUtils.info(Thread.currentThread().getName());
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ExecutorServiceJava中的一个接口,它是Executor的子类接口,提供了一些额外的方法来管理任务的生命周期和获取异步任务的执行结果。ExecutorService,我们可以更方便地线程池来执行任务。 ExecutorService的一些常用方法包括: 1. submit方法:用于提交一个Runnable或Callable的任务,并返回一个Future对象。对于Runnable任务,Future的get方法将返回null;对于Callable任务,Future的get方法将返回任务的执行结果。 2. invokeAny方法:用于提交一组Callable任务,并返回其中一个任务的执行结果。它会阻塞直到有一个任务完成并返回结果,忽略其他任务的执行结果。 3. invokeAll方法:用于提交一组Callable任务,并返回所有任务的执行结果。它会阻塞直到所有任务都完成并返回结果。 4. awaitTermination方法:用于等待所有任务在指定的时间内完成。如果所有任务在超时时间内完成,则返回true;否则返回false。 5. isShutdown方法:用于判断ExecutorService是否已经关闭。 6. shutdown方法:用于平滑地关闭ExecutorService。它将停止接收新的任务,并等待已经提交的任务完成。 7. shutdownNow方法:用于立即关闭ExecutorService。它将尝试取消所有正在执行的任务,并返回等待执行的任务列表。 8. isTerminated方法:用于判断所有任务是否已经完成。 这些方法可以帮助我们更灵活地管理和控制线程池中的任务的执行。比如,通过submit方法可以提交任务并获取任务的执行结果;通过invokeAny方法可以获取一组任务中最先完成的任务的执行结果;通过shutdown方法可以平滑地关闭线程池等。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Java高并发编程中Executor、ExecutorService使用及详细介绍-刘宇](https://blog.csdn.net/liuyu973971883/article/details/107947496)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [java ExecutorService使用方法详解](https://download.csdn.net/download/weixin_38689477/12790401)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值