使用ExecutorService有什么好处?

dev*_*ull 46 java concurrency multithreading executorservice

使用ExecutorService过度运行的线程Runnable进入Thread构造函数有什么好处?

and*_*soj 43

ExecutorService抽象出与原始等低级抽象相关的许多复杂性Thread.它提供了安全启动,关闭,提交,执行和阻止任务成功或突然终止的机制(表示为RunnableCallable).

JCiP,第6.2节,直接从马的嘴:

Executor可能是一个简单的接口,但它构成了一个灵活而强大的异步任务执行框架的基础,支持各种任务执行策略.它提供了将任务提交任务执行分离的标准方法,将任务描述为Runnable.这些Executor实现还提供生命周期支持和挂钩,用于添加统计信息收集,应用程序管理和监视.... 使用a Executor通常是在应用程序中实现生产者 - 消费者设计的最简单方法.

j.u.concurrent框架不是花时间实现(通常是错误的,并且付出巨大努力)并行性的底层基础架构,而是让您专注于构建任务,依赖关系,潜在的并行性.对于大量并发应用程序,可以直接识别和利用任务边界并使用j.u.c,从而使您可以专注于真正并发性挑战的更小的子集,这可能需要更专业的解决方案.

此外,尽管样板外观和感觉,总结并发实用程序Oracle API页面包含一些非常可靠的使用它们的参数,尤其是:

开发人员可能已经了解标准库类,因此无需了解ad-hoc并发组件的API和行为.此外,并发应用程序在可靠,经过良好测试的组件上构建时,调试起来要简单得多.

关于SO的这个问题询问了一本好书,答案就是JCiP.如果你还没有,请给自己一份.这种全面的并发方法远远超出了这个问题,从长远来看,这将为您节省很多心痛.


Man*_*nny 18

我看到的一个优点是管理/调度多个线程.使用ExecutorService,您不必编写自己的线程管理器,这可能会受到bug的困扰.如果您的程序需要一次运行多个线程,这将特别有用.例如,您希望一次执行两个线程,您可以轻松地执行以下操作:

ExecutorService exec = Executors.newFixedThreadPool(2);

exec.execute(new Runnable() {
  public void run() {
    System.out.println("Hello world");
  }
});

exec.shutdown();
Run Code Online (Sandbox Code Playgroud)

这个例子可能很简单,但是试着认为"hello world"行包含繁重的操作,并且你希望一次在多个线程中运行该操作以提高程序的性能.这只是一个示例,您仍然希望安排或运行多个线程并使用ExecutorService作为线程管理器.

对于运行单个线程,我没有看到使用ExecutorService的任何明显优势.


Pre*_*raj 10

传统线程的以下限制克服了Executor框架(内置线程池框架).

  • 资源管理不善,即不断为每个请求创建新资源.创建资源没有限制.使用Executor框架,我们可以重用现有资源并限制创建资源.
  • 不稳健:如果我们继续创建新线程,我们将获得StackOverflowException异常,因此我们的JVM将崩溃.
  • 开销创建时间:对于每个请求,我们需要创建新资源.创建新资源非常耗时.即线程创建>任务.使用Executor框架,我们可以在Thread Pool中构建.

线程池的好处

  • 使用线程池可以避免在请求或任务处理期间创建线程,从而缩短响应时间.

  • 使用线程池允许您根据需要更改执行策略.你可以通过替换ExecutorService实现从单线程转到多线程.

  • Java应用程序中的线程池通过创建基于系统负载和可用资源决定的配置数量的线程来提高系统的稳定性.

  • 线程池使应用程序开发人员从线程管理中解放出来,并允许专注于业务逻辑.

资源


sun*_*007 7

以下是一些好处:

  1. Executor服务以异步方式管理线程
  2. 在线程完成后使用callable来获取返回结果.
  3. 管理工作分配以从线程中释放线程和转售已完成的工作,以自动分配新工作
  4. fork - 用于并行处理的连接框架
  5. 线程之间更好的通信
  6. invokeAll和invokeAny提供更多控制权来一次运行任何或所有线程
  7. shutdown提供完成所有线程分配工作的功能
  8. Scheduled Executor Services提供了生成runnables和callables的重复调用的方法,希望它能帮到你