2012-10-18 68 views
4

对于每一个请求,都会有很多计算发生。平均而言,答复需要大约10分钟的时间来处理。与此同时,如果用户发送新的请求,先前的请求绝对没有意义。取消上一个请求

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


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

回答

2

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

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

你可以把你的大任务分成很多小任务吗?提前有条件退出可能是中断的好选择。

或者,等待/确保第一个任务完成操作并且其他人只是返回相同的值,这对您的环境有意义吗?如果是这样,我宁愿喜欢,而不是你的方法。有番石榴图书馆的LoadingCache正是这样做。

+0

谢谢。但是没有维护我们自己的线程池额外的开销。每个请求都使用额外的线程。其次它是如何影响服务器容量的?我认为tomcat使用一个CachedThreadPool,池的大小根据请求增加。 – Jatin

+0

最初,我用一个单独的Pool编写了代码。但后来将它移植出来。游泳池有几个优点。在一个sesnse,你正在打断你拥有的线程,而不是一些随机的线程。但是后来由于开销而移植了 – Jatin

+0

如果你不关心变化的服务器容量,你可以继续阻塞HTTP线程。无论如何,我认为在每个工作10分钟的情况下,创建新线程几乎没有成本。或者,如果你有一个静态/共享线程池,成本可以忽略不计。 – mindas

0

我不知道我完全理解你的问题......

但是,如果你谈论运行Tomcat应用程序内的线程池,并取消其今后的任务,我看到的是没有问题的。

我不会打断被Tomcat分配一个线程,除非我会写代码来处理中断个人(如servlet类内)

+0

是的,我会处理中断状态。基本上会抛出中断异常,并在正确的,将抓住参展,该任务被取消。这种方法唯一的问题是:我cancellign任务或threadpoolw之间没有区别请求关闭 – Jatin