【发布时间】:2010-09-15 12:17:34
【问题描述】:
我面临以下问题。我有一个 servlet,它通过视频剪辑为客户端请求提供服务。但是这个视频剪辑是另一个线程(转码器)的产物。如果由于转码器线程尚未完成其工作而未准备好下载剪辑,则客户端请求将失败! 关于如何处理这种情况的任何建议?如何在线程准备好转码剪辑之前停止 servlet 的响应?
提前致谢! 安东尼
【问题讨论】:
标签: java multithreading servlets
我面临以下问题。我有一个 servlet,它通过视频剪辑为客户端请求提供服务。但是这个视频剪辑是另一个线程(转码器)的产物。如果由于转码器线程尚未完成其工作而未准备好下载剪辑,则客户端请求将失败! 关于如何处理这种情况的任何建议?如何在线程准备好转码剪辑之前停止 servlet 的响应?
提前致谢! 安东尼
【问题讨论】:
标签: java multithreading servlets
这里最直接的做法是使用Future。向转码器提交请求,让它立即返回一个Future。然后 HTTP 线程可以阻止这个未来调用 get,直到视频准备好。
加入对我来说不是一个好的选择。 Thread#join 阻塞直到目标线程终止,但线程在完成工作后是否终止是实现细节。例如,如果转码器将使用缓存线程池,则 app.休息。
【讨论】:
您可以通过常规方式(睡眠、等待、加入、Future#get)延迟 servlet 的执行。
在您的情况下,听起来您想加入对视频进行转码的线程(或获取 Future)。
但是,只有在您需要阻止的时间仅为几秒钟时,您才应该这样做。否则,客户端浏览器可能会导致请求超时,或者用户体验很差。如果转码工作需要更长的时间,请考虑输出进度条之类的内容,它会不断轮询服务器,直到任务完成,然后才尝试加载视频剪辑。
【讨论】: