首页 / JAVA / java – 如何编写可中断的方法
java – 如何编写可中断的方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 如何编写可中断的方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2010字,纯文字阅读大概需要3分钟。
内容图文
![java – 如何编写可中断的方法](/upload/InfoBanner/zyjiaocheng/828/57612761220d4cffabc85824d332211c.jpg)
我有一种方法,从概念上看,它看起来像:
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.
最佳答案:
您可以使用接口和动态代理:
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 – 如何编写可中断的方法全部内容,希望文章能够帮你解决java – 如何编写可中断的方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。