Ostatnio przyglądałem się gorutynom Go i pomyślałem, że fajnie byłoby mieć coś podobnego w Javie. O ile szukałem, powszechnym sposobem zrównoleglenia wywołania metody jest zrobienie czegoś takiego:
final String x = "somethingelse";
new Thread(new Runnable() {
public void run() {
x.matches("something");
}
}).start();
To niezbyt eleganckie. Czy jest lepszy sposób na zrobienie tego? Potrzebowałem takiego rozwiązania w projekcie, więc zdecydowałem się zaimplementować własną klasę opakowującą wokół wywołania metody asynchronicznej.
Opublikowałem moją klasę wrapper w J-Go . Ale nie wiem, czy to dobre rozwiązanie. Użycie jest proste:
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
lub mniej szczegółowe:
Go.with(obj).callLater("myRandomMethod");
//... Go away
if (Go.lastResult().isReady()) //Blocks until myRandomMethod has ended
System.out.println("Method is finished!");
Wewnętrznie używam klasy, która implementuje Runnable i wykonuję trochę pracy Reflection, aby uzyskać poprawny obiekt metody i wywołać go.
Chcę uzyskać opinię na temat mojej małej biblioteki i na temat wykonywania wywołań metod asynchronicznych w Javie. Czy to jest bezpieczne? Czy jest już prostszy sposób?