java - 取消之前的请求

标签 java multithreading tomcat tomcat6 threadpool

对于每个请求,都会发生大量计算。平均而言,处理回复大约需要 10 分钟。同时,如果用户发送新请求;之前的请求完全没有继续下去的意义。

所以我写了一段代码,我基本上中断了执行它的前一个线程。在tomcat环境下是个好习惯吗?能不能有更好的方案来处理。中断tomcat线程可以吗? 还是我应该管理自己的线程池,让线程池为我进行计算?


更多信息: 基本上整个任务都是用 FutureTask 包装的。对于每个请求,都会执行此任务,并且对任务的引用由 ConcurrentHashMap 存储。对于每个请求, map 中的所有 future 都被“取消”,然后继续执行最新的请求。从而取消之前的请求。

最佳答案

Q> 我基本上是打断了之前执行它的线程。在tomcat环境下是个好习惯吗?
A> 我认为只要您愿意将 HTTP 线程阻塞 10 分钟就可以了。这意味着没有其他用户能够处理 HTTP 请求。否则创建您自己的线程池并对其进行管理。

问>在tomcat环境下是不是很好的做法?
A> 中断 RunnableCallable 可能很棘手。例如,如果您的线程正在进行 I/O 操作,中断会使数据处于损坏状态。除此之外,这是很正常的做法。我还建议使用您自己的线程池,以便您的服务器容量可预测。

你能把你的大任务分解成很多小任务吗?坚持条件并提前退出可能是中断的一个很好的替代方案。

或者,等待/确保第一个任务完成操作而其他任务只返回相同的值在您的环境中是否有意义?如果是这样,我宁愿选择那种方法而不是你的方法。 guava 库中的 LoadingCache 正是这样做的。

关于java - 取消之前的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12951137/

相关文章:

java - 当列表大到足以滚动时,回收器 View 适配器无法正常工作

java - 字符串中的表达式到数组列表

c++ - 使用 ATL 正确关闭在单独线程上创建的窗口

java.lang.ClassNotFoundException - JSF 中的 org.openrdf.repository.config.RepositoryConfigException

java - 无法在我的 Android 模拟器中创建文件夹

java - 带有 permitAll() 和过期 Auth Token 的 URL 的 Spring Security

java - 我可以将 PriorityBlockingQueue 与多个线程一起使用吗?

python - OpenMP 和 Cython 缺乏加速和错误结果

tomcat - SaaS 可扩展性 - Tomcat 是否足够可扩展?

angularjs - tomcat apache 8.5.4 中的 angular html5mode 在页面刷新时给出 404