Java EE服务器中的自有线程-最新技术

Java EE服务器中的自有线程-最新技术,java,multithreading,jakarta-ee,jsr,Java,Multithreading,Jakarta Ee,Jsr,我知道这被认为是不好的做法,在某些情况下是被禁止的(ejb) 因此,有三个截然不同的问题: 什么是最先进的技术,特别是它应该解决这个问题。这已经包含在某些应用服务器中了吗 禁止使用的规则涉及JavaEE容器。那雄猫呢?它不是一个功能齐全的JavaEE容器 我已经在网上搜索了很多关于这件事的资源,但它们主要是关于经验的博客和帖子,而且都很老了。您是否有一些链接,Sun/Oracle的官方链接会更好,它非常详细地解释了线程和JavaEE的情况。或者,如果SO政策不禁止,至少是一本好书 [更新] 对于

我知道这被认为是不好的做法,在某些情况下是被禁止的(ejb)

因此,有三个截然不同的问题:

  • 什么是最先进的技术,特别是它应该解决这个问题。这已经包含在某些应用服务器中了吗

  • 禁止使用的规则涉及JavaEE容器。那雄猫呢?它不是一个功能齐全的JavaEE容器

  • 我已经在网上搜索了很多关于这件事的资源,但它们主要是关于经验的博客和帖子,而且都很老了。您是否有一些链接,Sun/Oracle的官方链接会更好,它非常详细地解释了线程和JavaEE的情况。或者,如果SO政策不禁止,至少是一本好书

  • [更新]


    对于“own thread”,我的意思是使用java并发或经典的runnable接口来启动、等待等等。

    我想不出有多少情况下这是正确的做法

    创建自己的线程时最大的问题之一是,根据您创建线程的方式,它们无法访问您首先使用容器的所有功能

    我建议您尝试使用某种侦听器,然后在您喜欢的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中的地图、队列和主题中删除事件,效果非常好

    如果您仍然热衷于线程,下面的一篇文章将介绍一种非常干净的方法()

    最新技术是什么,特别是JSR 236应该解决这个问题。这已经包含在某些应用服务器中了吗

    JSR236(JavaEE的并发utils)最终成为JavaEE7的一部分。JavaEE7目前由GlassFish4实现,预计Wildfly 8(以前的JBossAS/EAP)将在明年初实现它

    JSR236当前的一个缺点是不能定义自己的线程池;您必须使用应用服务器提供的规范,它(IMHO)严重影响规范的可用性。您可以使用专有方法绕过此限制,例如,通过与图形用户界面交互或修改应用程序安装目录中的某些文件(在大公司通常不允许这样做)


    有关JSR 236的更多信息,请参阅。

    您的问题太广泛,因为有“三个不同的问题”。您是否建议重新措辞或删除一些要点?检查Glassfish是否支持JSR 236。试试看,把你的问题贴出来。第二个问题只适用于TomEE(Tomcat不是JavaEE容器),但这个问题并不局限于特定的容器。至于第三个,如果博客“相当”老的话“,我宁愿看
    @Asynchronous
    和/或MDB。@Leonardo forbidden是个大词。我们一直在JBoss和GlassFish等完整应用服务器中使用executor服务。请记住,这些线程是非托管的,如果您需要EJB,您需要从
    全局:
    JNDI名称空间引导它。@Leonardo使用TomEE而不是Tomcat怎么样。>
    我想不出有多少情况下这是正确的做法
    -这可能不是详细讨论这个问题的最佳场所,但是在大约10年的JavaEE开发中,我遇到了许多需要这样做的情况。您是对的,
    @Asynchronous
    是一个非常可行的替代方案,但它只通过一个线程池运行。如果从第一个异步执行另一个
    @Asynchronous
    ,并等待结果,则可以使池死锁。因此,生产者/消费者管道不能安全地使用它来实现。JSR236认识到这一需求,但IMHO尚未完全交付。