JavaEE容器不';不允许使用Java SE Concurency API

JavaEE容器不';不允许使用Java SE Concurency API,java,jakarta-ee,wildfly,wildfly-8,Java,Jakarta Ee,Wildfly,Wildfly 8,在Arun Gupta的《Java EE 7 Essentials》一书中,我发现: Java EE容器(如EJB或web容器)不允许使用公共Java SE并发API,如java.util.concurrent.ThreadPoolExecutor, 直接使用java.lang.Thread或java.util.Timer “不允许”是什么意思?我不明白容器如何禁止我创建新线程或使用标准执行器服务。我的标准线程会发生什么?有人能解释这些吗 一些评论。我理解为什么使用ManagedExecutor

在Arun Gupta的《Java EE 7 Essentials》一书中,我发现:

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

“不允许”是什么意思?我不明白容器如何禁止我创建新线程或使用标准执行器服务。我的标准线程会发生什么?有人能解释这些吗


一些评论。我理解为什么使用
ManagedExecutorService
而不是
ExecutorService
例如可以更高效,我不理解如果我使用SE会出现什么问题我认为如果你继续阅读,答案会解释得相当清楚。在本段后面:

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

我明白你为什么提出最初的问题了,虽然最初声明的措辞有点混乱

回答您的问题:
JavaEE容器不必显式地阻止您以预期的方式调用这些API(例如,如果您试图使用它们,则抛出异常)。一些JavaEE容器可能会使用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进行测试)

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

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


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

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

我明白你为什么提出最初的问题了,虽然最初声明的措辞有点混乱

回答您的问题:
JavaEE容器不必显式地阻止您以预期的方式调用这些API(例如,如果您试图使用它们,则抛出异常)。一些JavaEE容器可能会使用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进行测试)

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

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


容器正在运行您的代码,因此它当然会禁止您使用某些类。您将收到错误消息,您的软件将无法运行。我将收到什么类型的错误?我使用了标准的executor服务,在生产中的多个系统上都可以正常工作取决于容器,此外,您不能真正确定它是否“正常工作”。请举一些例子好吗?如果容器有自己的
SecurityManager
,它可以控制(并禁止)您的代码所做的很多事情。如果你的代码看起来运行得很好,那就足够了,但至少你已经被警告不应该这样做。您的“工作正常”代码运行在哪个容器上?该容器正在运行您的代码,因此它当然可以禁止您使用某些类。您将收到错误消息,您的软件将无法运行。我将收到什么类型的错误?我使用了标准的executor服务,在生产中的多个系统上都可以正常工作取决于容器,此外,您不能真正确定它是否“正常工作”。请举一些例子好吗?如果容器有自己的
SecurityManager
,它可以控制(并禁止)您的代码所做的很多事情。如果你的代码看起来运行得很好,那就足够了,但至少你已经被警告不应该这样做。您的“工作正常”代码运行在哪个容器上?