Ultimamente, tenho visto as goroutines do Go e achei que seria bom ter algo semelhante em Java. Tanto quanto eu procurei a maneira comum de paralelizar uma chamada de método é fazer algo como:
final String x = "somethingelse";
new Thread(new Runnable() {
public void run() {
x.matches("something");
}
}).start();
Isso não é muito elegante. Existe um jeito melhor de fazer isso? Como eu precisava dessa solução em um projeto, decidi implementar minha própria classe de wrapper em torno de uma chamada de método assíncrona.
Publiquei minha classe de wrapper no J-Go . Mas não sei se é uma boa solução. O uso é simples:
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
ou menos detalhado:
Go.with(obj).callLater("myRandomMethod");
//... Go away
if (Go.lastResult().isReady()) //Blocks until myRandomMethod has ended
System.out.println("Method is finished!");
Internamente, estou usando uma classe que implementa Runnable e faço algum trabalho de reflexão para obter o objeto de método correto e invocá-lo.
Eu quero uma opinião sobre minha pequena biblioteca e sobre o assunto de fazer chamadas de método assíncronas como esta em Java. É seguro? Já existe uma maneira mais simples?