如何在 Java 中异步调用方法

2022-08-31 07:17:03

我最近一直在看Go的goroutines,并认为在Java中有类似的东西会很好。据我所知,并行化方法调用的常用方法是执行如下操作:

final String x = "somethingelse";
new Thread(new Runnable() {
           public void run() {
                x.matches("something");             
    }
}).start();

这不是很优雅。有没有更好的方法来做到这一点?我在项目中需要这样的解决方案,所以我决定围绕异步方法调用实现我自己的包装类。

我在 J-Go 中发布了我的包装类。但我不知道这是否是一个好的解决方案。用法很简单:

SampleClass obj = ...
FutureResult<Integer> res = ...
Go go = new Go(obj);
go.callLater(res, "intReturningMethod", 10);         //10 is a Integer method parameter
//... Do something else
//...
System.out.println("Result: "+res.get());           //Blocks until intReturningMethod returns

或更详细:

Go.with(obj).callLater("myRandomMethod");
//... Go away
if (Go.lastResult().isReady())                //Blocks until myRandomMethod has ended
    System.out.println("Method is finished!");

在内部,我正在使用一个实现Runnable的类,并做一些反射工作来获取正确的方法对象并调用它。

我想对我的小库以及像Java中这样进行异步方法调用的主题发表一些意见。它安全吗?有没有更简单的方法?


答案 1

我刚刚发现有一种更干净的方式来做你的

new Thread(new Runnable() {
    public void run() {
        //Do whatever
    }
}).start();

(至少在 Java 8 中),您可以使用 lambda 表达式将其缩短为:

new Thread(() -> {
    //Do whatever
}).start();

就像在JS中制作函数一样简单!


答案 2

Java 8 引入的 CompletableFuture 在 package java.util.concurrent.CompletableFuture 中可用,可以用来做一个异步调用:

CompletableFuture.runAsync(() -> {
    // method call or code to be asynch.
});

推荐