我一直在为金融机构的大型企业系统工作很长一段时间。我只注意到异步方法的几个用法(坦率地说可能是2或3)。假设我有3种方法:doSomething1()
,doSomething2()
,doSomething3()
;
// X = {1,2,3}
SomeResult doSomethingX() {
// execution of this method takes 5-15 secs
}
xxx foo() {
SomeResult result1 = doSomething1();
SomeResult result2 = doSomething2();
SomeResult result3 = doSomething3();
// some code
}
所以执行foo需要 3x(5-15)sec = ~30sec
在我们的系统中有很多类似于foo
的方法,我想知道为什么没有任何异步方法?不会只是将@Async
添加到doSomethings()
方法会让它更快吗?或者仅仅是我们在企业系统中没有明确使用线程'
答案 0 :(得分:2)
总是值得记住,在您加入项目之前编写的代码可能是由具有更多经验或必须解决您未见过的独特问题的人编写的,并且在尝试更聪明的方法之后必须执行某些操作你觉得很奇怪也许有一些你错过的状态如果异步完成就不会存在。
但当然,情况可能只是:
a)开发人员不了解/使用它
或
b)当时无论出于何种原因,它都无法使用。
企业当然不会对异步代码,多线程或其他任何事情过敏。
答案 1 :(得分:0)
如果你使用spring,可以使用@Async注释来执行doSomething(),但这不是你所要做的全部:
您必须从方法返回AsyncResult,并且必须使用Future来管理返回值。以下“代码”或多或少取自spring示例:https://spring.io/guides/gs/async-method/:
Future res1 = doSomething("one");
Future res2 = doSomething("two");
Future res3 = doSomething("three");
// Wait until they are all done
while (!(res1.isDone() && res2.isDone() && res3.isDone())) {
Thread.sleep(10); //10-millisecond pause between each check
}
System.out.println(res1.get());
这已经是一个相当数量的编排(也许有更好的方法),但它让你了解在低级别处理并发的人工量。复杂性带来风险。
在我看来,大多数人都得出结论,让容器处理这样的缩放问题而不是手工处理它们会更好。您应该让容器扩展您的EJB和队列工作者。有很多java实现可以让你以这种方式扩展。
尽管如此,如果您使用如上所述的低级别方法制作了花费60秒的内容,那么请继续使用。你将成为英雄。