2015-12-29 2 views
1

В книге Arun Gupta "Java EE 7 Essentials" Я нашел это:Java EE контейнеры не позволяют использовать Java SE conccurency API

Java EE контейнеры, такие как EJB или веб-контейнер не позволяют использовать общая Java API-интерфейсы параллелизма SE, такие как java.util.concurrent.ThreadPoolExecutor, java.lang.Thread или java.util.Timer напрямую.

Что означает «не разрешать»? Я не понимаю, как контейнер может запретить мне создавать новый поток или использовать стандартный ExecutorService. Что будет с моими стандартными потоками? Может ли кто-нибудь объяснить это?

Некоторые замечания. Я понимаю, почему использование ManagedExecutorService вместо ExecutorService, например, может быть более эффективным, я не понимаю, какие проблемы могут возникнуть, если я буду использовать SE

+0

В контейнере работает ваш код, поэтому он может запретить вам использовать определенные классы. Вы получите сообщения об ошибках, и ваше программное обеспечение не будет запущено. – Kayaman

+0

Какую ошибку я получу?Я использовал стандартную услугу исполнителя, и все работает отлично на нескольких системах производства –

+0

Зависит от контейнера, кроме того, вы не можете быть уверены, что он «отлично работает». – Kayaman

ответ

4

Я думаю, что ответ объясняется достаточно четко, если вы продолжите чтение. Позже в абзаце:

... Это связано с тем, что весь код приложения запускается в потоке, управляемом контейнером, и каждый контейнер обычно ожидает, что весь доступ к объектам, поставляемым контейнером, будет происходить в одном потоке. Это позволяет контейнеру управлять ресурсами и обеспечивать централизованное администрирование. Кроме того, использование ресурсов неуправляемым образом не рекомендуется, поскольку оно может потенциально подорвать функции предприятия, которые платформа предназначена для обеспечения, например доступность, безопасность, надежность и масштабируемость.

Я могу понять, почему вы подняли свой первоначальный вопрос, хотя формулировка первоначального утверждения немного запутанна.

Чтобы ответить на ваш вопрос:
Java EE контейнеры не должны явно помешать вам называть этот API, в том, как можно было бы ожидать (например, бросать исключение, если вы пытаетесь использовать их). Некоторые контейнеры Java EE могут использовать SecurityManager или что-то, чтобы предотвратить доступ к определенным классам, но это не требуется спецификацией.

Однако контейнер Java EE не будет в состоянии управлять, что вы делаете с этим «неуправляемым» API, JavaSE, и это считается плохая практикой, чтобы использовать их, когда управляются эквиваленты доступны для вас (например, 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)

Однако, делая это считается плохой практикой, потому что:

Использование ресурсов в неуправляемой образом не рекомендуется, поскольку он потенциально может подорвать возможности предприятия, что платформа предназначена для обеспечения, такие как доступность, безопасность, надежность, и масштабируемость.

 Смежные вопросы

  • Нет связанных вопросов^_^