我知道这被认为是不好的做法,在某些情况下被禁止(ejb)。
所以,有三个不同的问题:
什么是最先进的技术,特别是JSR 236应该解决这个问题。这是否已包含在某些应用程序服务器中?
禁止的规则涉及Java EE容器。 Tomcat怎么样?它不是一个功能齐全的Java EE容器。
我已经在网上搜索过,发现很多资源都在谈论这个问题,但它们主要是关于体验的博客和帖子,所有这些都很老了。你有一些链接,Sun / Oracle的官方链接会更好,它会详细解释线程和Java EE的情况。或者至少,如果SO政策没有禁止,那么这本好书。
[UPDATE]
对于'自己的线程',我的意思是使用java并发或经典的runnable接口,包括start,wait等。
答案 0 :(得分:2)
什么是最先进的技术,特别是JSR 236应该解决这个问题。这是否已包含在某些应用程序服务器中?
JSR 236(Java EE的Concurrency utils)最终成为Java EE 7的一部分.Java EE 7目前由GlassFish 4实现,预计Wildfly 8(以前称为JBoss AS / EAP)将在明年初实施它
JSR 236的当前缺点是您无法定义自己的线程池;你必须使用应用服务器提供的那个(恕我直言)严重影响规范的可用性。您可以使用专有方法解决此限制,例如:可能通过与图形用户界面交互或修改应用程序安装目录中的某些文件(大型公司通常不允许这样做)。
有关JSR 236的一些其他资源,请参阅this。
答案 1 :(得分:0)
当这是正确的事情时,我想不出太多场合。
创建自己的线程时最大的问题之一是,根据您创建它们的方式,它们无法访问您首先使用容器的所有功能。
我建议您尝试使用某种侦听器,然后在您喜欢的bean上调用@Asynchronous
方法。请记住,为了使@Asynchronous
起作用,必须通过代理调用它,否则容器对调用一无所知,最终成为同一线程中的普通方法调用。
class MyListener {
private MyBean proxy;
MyListener(MyBean proxy) {
this.proxy = proxy;
}
void handler(MyEvent event) {
proxy.handler(event);
}
}
@ApplicationScoped
public class MyBean {
private MyBean proxy;
@PostConstruct
private void init() {
// Use JNDI or BeanManager to get a proxy to this bean
proxy = ??
}
@Asynchronous
void handler(MyEvent event) {
}
}
现在,即使您使用的侦听器不遵守容器线程规则,您仍然可以使用处理程序中的容器功能。我使用它来从Hazelcast中的地图,队列和主题中取出事件,并且效果很好。
如果你仍然坚持做线程,这篇文章解释了一种非常干净的方式(http://www.adam-bien.com/roller/abien/entry/conveniently_transactionally_and_legally_starting)。