В последнее время я смотрел горутины 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. Это безопасно? Есть ли уже более простой способ?