gpt4 book ai didi

java - 如何编写可中断的方法

转载 作者:搜寻专家 更新时间:2023-10-31 19:50:37 25 4
gpt4 key购买 nike

我有一个方法,从概念上讲,它类似于:

Object f(Object o1) {
Object o2 = longProcess1(o1);
Object o3 = longProcess2(o2);
return longProcess3(o3);
}

过程本身也可能是复合的:

Object longProcess1(Object o1) {
Object o2 = longSubProcess1(o1);
return longSubProcess2(o2);
}

等等,不同的进程可能位于不同的模块中。大多数进程都很长,因为它们的计算量很大,而不是 IO 限制。

到目前为止一切顺利,但现在我希望 f 作为一个整体是可中断的。 The recommended Java way to do that是用Thread.interrupted()定期检查中断标志。它非常简单,但如果我需要将我的方法更改为类似以下内容,它很快就会变得很麻烦:

Object f(Object o1) {
Object o2 = longProcess1(o1);
if (Thread.interrupted()) throw new InterruptedException();
Object o3 = longProcess2(o2);
if (Thread.interrupted()) throw new InterruptedException();
return longProcess3(o3);
}

Object longProcess1(Object o1) {
Object o2 = longSubProcess1(o1);
if (Thread.interrupted()) throw new InterruptedException();
return longSubProcess2(o2);
}

...

现在,我确实理解了这样工作的合理性 - 它允许我更好地控制何时抛出 InterruptedException(例如),避免让对象处于不一致的状态 - 但是 我很想知道是否有更优雅的方法*

* 在 Java 中,而不是 AspectJ,我想这在这里非常合适,但我仍然坚持使用 Java。

最佳答案

您可以使用接口(interface)和动态代理:

public class Wrapper {
public static <T> T wrap(Class<T> intf, final T impl) {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Object proxy = Proxy.newProxyInstance(cl, new Class<?>[] {intf},
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if (Thread.interrupted()) {
throw new InterruptedException();
}
return method.invoke(impl, args);
}
});
return intf.cast(proxy);
}
}

interface Processes {
Object longProcess1(Object o);
...
}

public class ProcessesImpl implement Processes {
Processes self = Wrapper.wrap(Processes.class, this);

public Object f(Object o1) {
Object o2 = self.longProcess1(o1);
Object o3 = self.longProcess2(o2);
return self.longProcess3(o3);
}

public Object longProcess1(Object o1) {
Object o2 = self.longSubProcess1(o1);
return self.longSubProcess2(o2);
}

....
}

关于java - 如何编写可中断的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3178706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com