Java Comet方法:将线程返回到ExecutorService池,而不是在特定的时间间隔内休眠
我正试图通过以下方式为类似Facebook的浏览器推送通知实施comet方法: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
// 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,它解决了我的问题。