java - Jboss Java EE 容器和一个 ExecutorService

标签 java multithreading concurrency jboss ejb

我有一个独立的 java 应用程序,它使用 ExecutorService 来并行处理多个作业

 ExecutorService es = Executors.newFixedThreadPool(10);

我现在想在 EJB bean 中重复使用相同的解决方案,但不确定如何正确初始化 ThreadPool,因为我通常会离开 Java EE 容器来控制所有线程资源。我可以只使用相同的代码还是有其他正确的方法来获取 Jboss 托管线程池?

最佳答案

在 EJB 中执行此操作的正确方法是使用 ManagedExecutorService,它是 Concurrency Utils API (Java EE7) 的一部分。您不应在企业代码中使用属于 java.util.concurrent 的任何 ExecutorService。

通过使用 ManagedExecutorService,您的新线程将由容器创建和管理。

以下示例取 self 的网站 here .

要使用 ManagedExecutorService 创建一个新线程,首先要创建一个实现 Callable 的任务对象。在 call() 方法中,我们将定义我们希望在单独的线程中执行的工作。

public class ReportTask implements Callable<Report> {

    Logger logger = Logger.getLogger(getClass().getSimpleName());

    public Report call() {
        try {
            Thread.sleep(3000);
        catch (InterruptedException e) {
            logger.log(Level.SEVERE, "Thread interrupted", e);
        }
        return new Report();
    }
}

然后我们需要通过将任务传递给 ManagedExecutorService 的 submit() 方法来调用该任务。

@Stateless
public class ReportBean {

    @Resource
    private ManagedExecutorService executorService;

    public void runReports() {
        ReportTask reportTask = new ReportTask();
        Future<Report> future = executorService.submit(reportTask);
    }
}

关于java - Jboss Java EE 容器和一个 ExecutorService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13932083/

相关文章:

java - intellij idea中tomcat运行配置启动时间长

java - 多线程中的同步块(synchronized block)

java - 多线程Java单例不断重置

c# - ASP.NET 异步等待操作中的线程处理

Python 映射函数、线程​​、大结构

Python 多线程/处理模块,用于具有需要排序的依赖项的任务

java - Spring-Boot Quartz 作业未运行

java - StringBuilder.append() 是否应该始终优先于串联?

java - Room 数据库、RecyclerView 和并发问题

concurrency - AKKA 如何为单个 Actor 提供并发?