2016-10-16 14 views
0

Есть ли какие-либо преимущества результата обработки с использованием ListenableFuture при отправке задач на ExecutorService вместо того, чтобы делать это простым старым способом java, просто вызывая функцию, обрабатывающую результаты?ListenableFuture или функция вызова для обработки результата задачи?

Будущее:

Future<ScanResult> result = threadPoolExecutor.submit(
    new Callable<ScanResult>() { 
     //long running process to get scanResult 
     return scanResult; 
    }); 
ScanResult sr = result.get(); 

ИЛИ использование гуавы ListenableFuture предотвратить вручную get() призвание.

Plain Java Путь:

threadPoolExecutor.submit(new Callable<Void>() { 
    @Override 
    public Void call() throws Exception { 
     //long running process to get scanResult 
     jobCompleted(scanResult); 
     return null; 
    } 
}); 
+0

Ваши примеры не имеют смысла. Похоже, это не то, как вы будете использовать будущее для прослушивания. –

+0

@HovercraftFullOfEels вы правы, это пример нормального будущего, следовательно, добавление в код "(или используйте guava ListenableFuture для предотвращения вызова get() вручную). –

+0

Нет, это не то, что я имею в виду. У вас нет долгого кода в Callable, и он ничего не возвращает, что уменьшает необходимость вызова 'get()'. –

ответ

1

Я не работал на Гуаву параллельности или ListenableFuture, но я думаю, что главное преимущество является родовой события на основе разработки программ которые легче понять и визуализировать, чем вручную запуск код на основе событий.

Future.get() является блокирующим способом, поэтому вы заблокированы до тех пор, пока Callable не будет завершен, поэтому вы соединяете два независимых пути выполнения кода в один путь выполнения. Добавление слушателя отделяет их и связывает их логически на основе события.

Также согласно github link, рекомендуется использовать его, и я думаю, что причиной этого могут быть дополнительные услуги, поддерживаемые ListenableFuture, которые могут отсутствовать на простом Future.

Надеюсь, это поможет!

+0

Приветствия! Я получаю ваше мнение о нормальном будущем. Но я не вижу преимуществ использования ListenableFuture для старых прослушивателей Java-сообщений. ListenableFuture также отделяет путь выполнения так же, как и прослушиватель (т. Е. Нет необходимости вызывать блокировку future.get). Может быть, я пропустил что-то очень простое? –