gpt4 book ai didi

java - 从在单独线程中运行的函数返回值

转载 作者:行者123 更新时间:2023-12-02 07:17:05 27 4
gpt4 key购买 nike

我有这段代码,如果函数上存在“异步”注释,则允许在单独的线程中执行函数。一切工作正常,除了有一天我意识到我还必须处理我刚刚添加的一些新函数的返回值。我可以为此使用处理程序和消息传递,但是,由于已经构建的项目结构(庞大且工作正常),我无法更改现有函数来处理消息传递。

代码如下:

/**
* Defining the Asynch interface
*/
@Retention(RetentionPolicy.RUNTIME)
public @interface Asynch {}

/**
* Implementation of the Asynch interface. Every method in our controllers
* goes through this interceptor. If the Asynch annotation is present,
* this implementation invokes a new Thread to execute the method. Simple!
*/
public class AsynchInterceptor implements MethodInterceptor {
public Object invoke(final MethodInvocation invocation) throws Throwable {
Method method = invocation.getMethod();
Annotation[] declaredAnnotations = method.getDeclaredAnnotations();
if(declaredAnnotations != null && declaredAnnotations.length > 0) {
for (Annotation annotation : declaredAnnotations) {
if(annotation instanceof Asynch) {
//start the requested task in a new thread and immediately
//return back control to the caller
new Thread(invocation.getMethod().getName()) {
public void execute() {
invocation.proceed();
}
}.start();
return null;
}
}
}
return invocation.proceed();
}
}

现在,我如何将其转换为:

@Asynch
public MyClass getFeedback(int clientId){

}

MyClass mResult = getFeedback(12345);

“mResult”会更新为返回值吗?

提前致谢...

最佳答案

从根本上来说你不能。 getFeedback 必须以同步方式返回某物 - 在某些情况下你可以稍后更新返回的对象,在其他情况下你显然不能 - 不可变的类,例如String 就是明显的例子。您以后无法更改变量 mResult 的值...毕竟它很可能是一个局部变量。事实上,当计算出结果时,使用该结果的方法可能已经完成......使用虚假值。

仅通过在同步语言之上添加注释,您将无法获得干净的异步性。理想情况下,异步操作应该返回类似 Future<T> 的内容,表示“稍后的某个时刻,将会有一个结果”——以及找出该结果是什么、是否已计算、是否存在异常的方法这类事情正是 C# 5 中添加 async/await 的原因 - 因为即使使用 AOP,您也无法在库级别透明地执行此操作。编写异步代码应该是一个非常深思熟虑的决定 - 而不仅仅是通过注释固定到同步代码上的东西。

关于java - 从在单独线程中运行的函数返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14808037/

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