gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:01:35 25 4
gpt4 key购买 nike

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

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

“不允许”是什么意思?我不明白容器如何禁止我创建新线程或使用标准 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 容器将无法管理您使用这些“非托管”JavaSE 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.

关于Java EE 容器不允许使用 Java SE 并发 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34514750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com