私は最近、 Go のゴルーチンを見ていて、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 でこのような非同期メソッド呼び出しを行うことについて意見が欲しいです。安全ですか?もっと簡単な方法はすでにありますか?