【问题标题】:Cancel previous request取消先前的请求
【发布时间】:2012-10-08 16:53:27
【问题描述】:

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

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


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

【问题讨论】:

    标签: java multithreading tomcat tomcat6 threadpool


    【解决方案1】:

    我不确定我是否完全理解你的问题......

    但是,如果您说的是在 tomcat 应用程序中运行线程池并取消其未来的任务,我认为这没有问题。

    我不会中断由tomcat分配的线程,除非我会编写代码来亲自处理中断(例如在servlet类中)

    【讨论】:

    • 是的,我将处理中断状态。基本上会抛出 Interrupted Exception 并在最上面,会捕获显示任务被取消。这种方法的唯一问题是:我取消任务或线程池按要求关闭没有区别
    【解决方案2】:

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

    Q> 在 tomcat 环境中这是一个好习惯吗?
    A> 中断 Runnables 或 Callables 可能会很棘手。例如,如果您的线程处于 I/O 操作的中间,中断可能会使数据处于损坏状态。除此之外,这是很正常的做法。我还建议使用您自己的线程池,以使您的服务器容量可预测。

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

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

    【讨论】:

    • 谢谢。但是维护我们自己的线程池不是额外的开销。您为每个请求使用额外线程的地方。其次,它如何影响服务器容量?我认为tomcat使用了一个CachedThreadPool,池的大小会根据请求而增加。
    • 最初我用一个单独的池编写了代码。但后来移植出来了。拥有游泳池有几个优点。从某种意义上说,您正在中断您拥有的线程,而不是某个随机线程。但后来由于开销而移植
    • 如果您不太关心服务器容量的变化,您可以继续阻塞 HTTP 线程。无论如何,我认为在每个工作 10 分钟的情况下,创建一个新线程几乎没有成本。或者,如果你有一个静态/共享线程池,成本可以忽略不计。
    猜你喜欢
    • 2020-10-26
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2021-11-22
    • 1970-01-01
    • 2012-09-08
    相关资源
    最近更新 更多