Últimamente he estado mirando goroutines de Go y pensé que sería bueno tener algo similar en Java. Por lo que he buscado, la forma común de paralelizar una llamada a un método es hacer algo como:
final String x = "somethingelse";
new Thread(new Runnable() {
public void run() {
x.matches("something");
}
}).start();
Eso no es muy elegante. ¿Existe una mejor manera de hacer esto? Necesitaba una solución de este tipo en un proyecto, así que decidí implementar mi propia clase contenedora en torno a una llamada al método asíncrono.
Publiqué mi clase contenedora en J-Go . Pero no sé si es una buena solución. El uso es simple:
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
o menos detallado:
Go.with(obj).callLater("myRandomMethod");
//... Go away
if (Go.lastResult().isReady()) //Blocks until myRandomMethod has ended
System.out.println("Method is finished!");
Internamente, estoy usando una clase que implementa Runnable y hago un trabajo de reflexión para obtener el objeto de método correcto e invocarlo.
Quiero una opinión sobre mi pequeña biblioteca y sobre el tema de hacer llamadas a métodos asíncronos como esta en Java. ¿Es seguro? ¿Existe ya una forma más sencilla?