Java Comet方法:将线程返回到ExecutorService池,而不是在特定的时间间隔内休眠

Java Comet方法:将线程返回到ExecutorService池,而不是在特定的时间间隔内休眠,java,multithreading,jakarta-ee,comet,Java,Multithreading,Jakarta Ee,Comet,我正试图通过以下方式为类似Facebook的浏览器推送通知实施comet方法: HTTP请求是使用AJAX向一个简单的Servlet发出的,它被提交到java.util.concurrent.Executor(使用AsyncContext),HTTP线程立即被释放。此请求由后台线程拾取 线程池中的后台工作线程每30秒检查一次新通知(查询数据库)。如果有任何通知,则为其发送的响应。否则,在特定超时(即5分钟)后,将发送“无通知”响应。客户端立即发出一个新请求,并重复该过程 这里的问题是,我使用Th

我正试图通过以下方式为类似Facebook的浏览器推送通知实施comet方法:

  • HTTP请求是使用AJAX向一个简单的Servlet发出的,它被提交到java.util.concurrent.Executor(使用AsyncContext),HTTP线程立即被释放。此请求由后台线程拾取
  • 线程池中的后台工作线程每30秒检查一次新通知(查询数据库)。如果有任何通知,则为其发送的响应。否则,在特定超时(即5分钟)后,将发送“无通知”响应。客户端立即发出一个新请求,并重复该过程
  • 这里的问题是,我使用Thread.sleep(30000)定期检查数据。 每个请求仍有一个线程被占用。这段时间(30秒)被浪费了,线程仍然无法满足任何其他请求

    我可以使用什么技术,在检查新通知后立即将线程返回到池中?然后池中的其他可用线程在30秒后执行相同的操作以检查通知,等等

    代码如下:

    // Creation of a global async Executor on ServletContextListener. contextInitialized
       Executor executor =
                        new ThreadPoolExecutor(1, 1, 50000L,
                            TimeUnit.MILLISECONDS,
                            new LinkedBlockingQueue<Runnable>(100));
    
    // Delegate the request to async thread 
       executor.execute(new RunnableClass(asyncContext));
    
    
    
     // In RunnableClass.run() method
    
        while(timeout5Min)
        {
           boolean newNotificationPresent = checkIfNotificationPresent(reqId);
    
           if(!newNotificationPresent)
             Thread.sleep(30000);
        }
    
     // send response
    
    //在ServletContextListener上创建全局异步执行器。上下文初始化
    遗嘱执行人=
    新的线程池执行器(1,1,50000L,
    TimeUnit.ms,
    新的LinkedBlockingQueue(100));
    //将请求委托给异步线程
    execute(新的RunnableClass(asyncContext));
    //在RunnableClass.run()方法中
    同时(超时5分钟)
    {
    布尔值newNotificationPresent=checkIfNotificationPresent(reqId);
    如果(!newNotificationPresent)
    睡眠(30000);
    }
    //发送响应
    

    ScheduledThreadPoolExecutor可以在这种情况下使用吗?还有其他技术吗?

    如果你想提高线程效率,你应该考虑参与者。 看看


    否则,请不要睡觉,使用

    计划重新检查谢谢BGR的回复。我尝试了ScheduledThreadPoolExecutor,它解决了我的问题。