Java EE 容器不允许使用 Java SE 并发性 API

Java EE containers don't allow using Java SE conccurency API

在 Arun Gupta 的书中 "Java EE 7 Essentials" 我发现了这个:

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

"do not allow"是什么意思?我不明白容器如何禁止我创建新线程或使用标准 ExecutorService。我的标准线程会怎样?谁能解释一下这些?

一些评论。我明白为什么使用 ManagedExecutorService 而不是 ExecutorService 可以更有效,我不明白如果我使用 SE

会出现什么问题

如果您继续阅读,我认为答案已经解释得很清楚了。段落后面:

... This is because all application code is run on a thread managed by the container, and each container typically expects all access to container-supplied objects to occur on the same thread. This allows the container to manage the resources and provide centralized administration. Further, using resources in a nonmanaged way is discouraged, because it can potentially undermine the enterprise features that the platform is designed to provide, such as availability, security, reliability, and scalability.

虽然我明白你为什么提出最初的问题,但最初陈述的措辞有点令人困惑。

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

但是,Java EE 容器将无法管理您使用这些 "unmanaged" JavaSE API 所做的任何事情,并且在有这些 API 时使用它们被认为是不好的做法您可用的托管等效项(例如 ManagedExecutorServiceExecutorService

为了说明,以下代码在 Servlet 中工作得很好:

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

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

(使用 WebSphere Liberty 测试)

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

Using resources in a nonmanaged way is discouraged, because it can potentially undermine the enterprise features that the platform is designed to provide, such as availability, security, reliability, and scalability.