Использование Future, описанное в приведенных выше ответах, выполняет задание, но немного менее существенно, как f.get (), блокирует поток до получения результата, что нарушает параллелизм.
Лучшее решение - использовать ListenableFuture от Guava. Пример:
ListenableFuture<Void> future = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(1, new NamedThreadFactory).submit(new Callable<Void>()
{
@Override
public Void call() throws Exception
{
someBackgroundTask();
}
});
Futures.addCallback(future, new FutureCallback<Long>()
{
@Override
public void onSuccess(Long result)
{
doSomething();
}
@Override
public void onFailure(Throwable t)
{
}
};