Нещодавно я переглядав goroutine Go і думав, що було б непогано мати щось подібне на Java. Наскільки я шукав поширений спосіб паралелізації виклику методу - це зробити щось на кшталт:
final String x = "somethingelse";
new Thread(new Runnable() {
public void run() {
x.matches("something");
}
}).start();
Це не дуже елегантно. Чи є кращий спосіб зробити це? Мені потрібно було таке рішення в проекті, тому я вирішив реалізувати власний клас обгортки навколо виклику методу async.
Я опублікував свій клас обгортки в 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. Це безпечно? Чи є вже більш простий спосіб?