The Java EE philosophy has, for a long time, been able to give its users a well-defined and safe programming model. This is why most of the Java EE defaults are about being thread-safe, and that several specifications such as Enterprise Java Beans (EJB) defaults were preventing custom thread usage. It does not mean Java EE was ignoring threads at all, but explicitly using thread pools from an application was not very natural. Also, most of the time, the adopted coding style was either against Java EE's (strict) rules or were very verbose.
Before detailing the new API added by Java EE to help you develop concurrent applications, let's see the basic Java EE model and how it can already help you to scale.
If we take back the specifications included in Java EE 8 (full profile), we'll get a long list. Now, if we check which specifications use...