我想不出有多少场合这是正确的做法。
创建自己的线程时最大的问题之一是,根据您创建线程的方式,它们首先无法访问您使用容器的所有功能。
我建议您尝试使用某种侦听器,然后@Asynchronous
在您最喜欢的 bean 上调用方法。请记住,为了@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)。