Java EE规范和multithreading

我正在使用Struts和Spring编写Java EE应用程序。 在其中一个操作中,存在大量数据库处理,因此存在性能问题。 我想知道的是我可以在这里使用multithreading吗? 我认为Java EE规范不允许创建自定义线程,而不是由Server创建的线程(我使用Weblogic)。 请指导我完成这个。

这个问题偶尔出现一次。

根据规范,它没有被授权。 要查看的最佳页面是: Q / A:J2EE限制

也就是说,有一些方法可以生成线程,特别是在Weblogic中使用WorkManager

看到这些问题:

  • EJB如何并行化长时间CPU密集型流程?
  • 为什么不鼓励在J2EE容器中生成线程?
  • J2EE程序员不会写入文件

第一个目标EJB的事实并不重要,最后一个关于访问文件系统的事实是关于一般限制。

希望能帮助到你。

在Java EE环境中创建线程的推荐方法是使用Concurrency Utils API,它是EE7规范的一部分。

通过使用此API,您的新线程将由容器创建和管理,从而保证您的线程可以使用所有EE服务(例如安全性,事务)。

以下示例来自我自己的网站

使用ManagedExecutorService

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

 public class ReportTask implements Callable { 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 future = executorService.submit(reportTask); } } 

使用ManagedThreadFactory

首先创建一个Runnable任务,该任务将定义在后台完成哪些工作。

 public class ReportTask implements Runnable { Logger logger = Logger.getLogger(getClass().getSimpleName()); public void run() { try { //do your background task Thread.sleep(10000); } catch (InterruptedException e) { logger.log(Level.SEVERE, "Thread interrupted", e); } } } 

要获取容器管理线程,我们只需向ManagedThreadFactory询问新线程,并将其传递给Runnable实例。 要启动该线程,我们调用start()。

 @Stateless public class ReportBean { @Resource private ManagedThreadFactory threadFactory; public void runReports() { ReportTask reportTask = new ReportTask(); Thread thread = threadFactory.newThread(reportTask); thread.start(); } } 

这些限制主要是因为Java EE和EJB希望支持透明群集。 例如,群集中的一个服务器不应修改文件,因为这些更改无法轻松镜像到其他服务器。 对于线程,存在每个群集或每个服务器应该有一个线程的问题。 应用程序服务器也无法轻松监视这些线程。

也就是说,应该可以创建线程,套接字连接或访问Java EE服务器中的文件系统,就像在普通应用程序中一样。