Таким образом, вы хотите, чтобы код выполнялся асинхронно и записывал результат в переменную outputData
спустя некоторое время после завершения всех вычислений. Во-первых, если outputData
является локальной переменной, это просто невозможно. Во-вторых, если outputData
является полем, это возможно, но не удобно: когда вы в конечном итоге захотите использовать это значение, как вы узнаете, что асинхронное вычисление завершено? Таким образом, чтобы справиться с этой ситуацией, был разработан интерфейс java.util.concurrent.Future
.
Обычный подход для вызова такого изолированного асинхронного кода заключается в использовании ExecutorService.submit(Callable)
, который возвращает Future
. Когда вам нужен результат вычисления, вы вызываете Future.get()
и ждете, пока результат не будет вычислен:
ExecutorService pool = ForkJoinPool.commonPool(); // or use any other ExecutorService
Callable<ArrayList> function = ()->parseData(in_data, category, lastKey, firstKey);
Future<ArrayList> future = pool.submit(function); // computation started in parallel, we can do other work
...
ArrayList res = future.get(); // when we eventually need the result of asynchronous computation