Java:如何为当前线程中运行的函数设置超时
在当前线程为依赖ThreadLocal的Java函数实现超时机制
我有一个多线程Java应用,通过ThreadLocal字段实现线程隔离。为防范DOS攻击,需要为部分函数添加超时机制。
我需要的是给当前线程中运行的Java函数设置超时。
我见过很多这类方案,比如创建Future在新线程中执行代码并等待完成的实现,但这和我的需求相反——我不能把目标函数放到新线程里跑。
以下是多线程环境中的示例代码:
class MyClass { // ThreadLocal 不设为private,方便回调访问 ThreadLocal<AtomicInteger> counter = ThreadLocal.withInitial(AtomicInteger::new); public void entry(Function<?, ?> callback) { counter.get().set(10); // 调用线程完成初始化 I_need_a_timeout(callback, 110); // 调用可能长时间运行的函数 int result = counter.get().get(); // 未超时的话结果应为110 } private void I_need_a_timeout(Function<?, ?> callback, int loop) { while (loop-- >= 0) { counter.get().incrementAndGet(); callback.apply(null); // 这个回调可能耗时很久 } } }
我需要在I_need_a_timeout运行超时后终止它,但如果用Future将其放到新线程执行,会因为线程独立拥有自己的AtomicInteger实例,导致调用代码读取到的永远是初始化值(此处为10)。
更新:我更新了示例代码以贴近实际场景。客户端传入的回调函数可能耗时极长甚至永不返回,因此轮询类方案不可行。
内容的提问来源于stack exchange,提问作者Stormcloud
相关产品推荐
相关产品推荐

