Java EE容器不允许使用Java SE conccurency API

时间:2015-12-29 16:09:37

标签: java java-ee wildfly wildfly-8

在Arun Gupta和#34; Java EE 7 Essentials"我发现了这个:

Java EE容器(如EJB或Web容器)不允许使用通用Java SE并发API,如java.util.concurrent.ThreadPoolExecutor, 直接使用java.lang.Thread或java.util.Timer。

什么意思"不允许"?我不明白容器如何禁止我创建新线程或使用标准ExecutorService。我的标准线程会发生什么?任何人都可以解释这些吗?

有些评论。我理解为什么使用ExecutorService代替{{1}}例如可以提高效率,我不明白如果我使用SE会出现什么问题

1 个答案:

答案 0 :(得分:4)

我认为如果继续阅读,答案会得到相当清楚的解释。在段落的后面:

  

...这是因为所有应用程序代码都在容器管理的线程上运行,并且每个容器通常都希望对容器提供的对象的所有访问都发生在同一个线程上。这允许容器管理资源并提供集中管理。此外,不鼓励以非托管方式使用资源,因为它可能会破坏平台旨在提供的企业功能,例如可用性,安全性,可靠性和可伸缩性。

我可以看到为什么你提出了你的初步问题,初始陈述的措辞有点令人困惑。

回答你的问题:
Java EE容器不必显式阻止您以您期望的方式调用这些API(例如,如果您尝试使用它们,则抛出异常)。某些Java EE容器可能使用SecurityManager或其他东西来阻止访问某些类,但这样做并不是规范所要求的。

但是,Java EE容器将无法管理您使用这些“非托管”JavaSE API执行的任何操作,并且当您可以使用托管等效项时(例如ManagedExecutorService)使用它们被认为是不好的做法。 vs ExecutorService

为了说明,以下代码在Servlet中正常工作:

Runnable printSomething = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello");
    }
};

new java.lang.Thread(printSomething, "JavaSE-Thread").start();

(使用WebSphere Liberty测试)

然而,这样做被认为是不好的做法,因为:

  

不鼓励以非托管方式使用资源,因为它可能会破坏平台旨在提供的企业功能,例如可用性,安全性,可靠性和可伸缩性。