【问题标题】:What is the difference between ManagedExecutorService and ExecutorService in javajava中ManagedExecutorService和ExecutorService有什么区别
【发布时间】:2018-09-14 12:18:00
【问题描述】:

我需要在 Wildfly java ee 应用程序中向执行器服务提交任务。

目前的代码如下,

ExecutorService jobExecutorService = Executors.newSingleThreadExecutor(); jobExecutorService.submit(new Task(request));

在每个请求上,同一段代码将运行并为单线程执行器提交任务。

但我不确定新构建的线程是否是托管的,或者它是否是在我的 java ee 应用程序中为任何异步流提交任务的正确方式。

如果我需要启动一个应该由容器管理的线程,我需要使用 ManagedExecutorService 还是有任何其他实现。

需要一些这方面的知识。

【问题讨论】:

  • 标题有ManagedExecutorService,但没有问题正文。你错过了一部分吗?

标签: java concurrency


【解决方案1】:

回答题外问题:

ManagedExecutorService 是Java EE specification 的一部分,而ExecutorService 是Java SE specification 的一部分。

这两个接口的主要区别在于ManagedExecutorService只是一个

ExecutorService 的可管理版本。

由于您不应该在 Java EE 环境中生成任何非托管线程,因此您应该只在其中使用托管的东西,而非托管的对于 Java SE 应用程序来说非常好。

在 Java EE 应用程序中获取 ManagedExecutorService 的正确方法是使用 @Resource 注释注入 ManagedExecutorService

@Resource
ManagedExecutorService managedExecutorService;

【讨论】:

  • 嗨@maio290,在Java EE 应用程序中使用ExecutorService 会导致创建非托管线程吗?
  • 好吧,我猜是的。
  • @srinivas 是的!
  • 我见过 Java EE 应用程序使用 ExecutorService 进行异步执行。所以这不是正确的方法吗?
  • 是的,这不是 EE 环境中的“正确”方法,因为它放弃了服务器的线程管理。但是,这可能只会对负载高的系统产生影响,只要线程没有泄漏任何资源。因此,我认为在许多情况下影响可以忽略不计,但由于它很容易重构,因此对任何人来说都不是什么大问题。
【解决方案2】:

ExecutorService 不需要任何 Web 容器,因为 ManagedExecutorService 用于将应用程序部署到 Web 服务器的上下文中,其中创建线程池并由容器维护其生命周期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-23
    • 2011-07-30
    • 2011-06-02
    • 2010-09-19
    相关资源
    最近更新 更多