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 时使用它们被认为是不好的做法您可用的托管等效项(例如 ManagedExecutorService
与 ExecutorService
)
为了说明,以下代码将在 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.
在 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 时使用它们被认为是不好的做法您可用的托管等效项(例如 ManagedExecutorService
与 ExecutorService
)
为了说明,以下代码将在 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.