Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Как использовать CompletableFuture  [new]
Molasar
Member

Откуда:
Сообщений: 584
Всем привет!

Использовал Future для вычисления чисел Фибоначчи. Класс Fibo callable.
ExecutorService executorService = Executors.newCachedThreadPool();
Future<Long> future = executorService.submit(new Fibo(45));

Прочитал, что можно использовать CompletableFuture, чтобы выполнение кода не приостанавливалось при future.get();
Все статьи в инете описывают использование CompletableFuture с интерфейсом Supplier:
CompletableFuture<String> future = CompletableFuture
        .supplyAsync(() -> "Hi", Executors.newCachedThreadPool());

А как мне воткнуть свой класс Fibo в CompletableFuture.supplyAsync()?
2 апр 19, 16:07    [21850304]     Ответить | Цитировать Сообщить модератору
 Re: Как использовать CompletableFuture  [new]
st07mnn
Member

Откуда:
Сообщений: 40
Molasar
Прочитал, что можно использовать CompletableFuture, чтобы выполнение кода не приостанавливалось при future.get();
Где прочитали?

import java.util.concurrent.*;

public class CompletableFutureDemo {

    public static void main(String[] args) throws TimeoutException {
        final ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        final CompletableFuture<Long> future = CompletableFuture
                .supplyAsync(() -> new Fibo(45).call(), cachedThreadPool);
        try {
            System.out.println(future.get(500L, TimeUnit.MILLISECONDS));
        } catch (InterruptedException | ExecutionException e) {
            throw new RuntimeException(e);
        } finally {
            cachedThreadPool.shutdown();
        }
    }

}

class Fibo implements Callable<Long> {

    private int idx;

    public Fibo(int idx) {
        this.idx = idx;
    }

    @Override
    public Long call()  {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        return 1L;
    }
}


Примеры задач, для которых удобен класс CompletableFuture:
1. Combining two asynchronous computations in one
2. Waiting for the completion of all tasks performed by a set of Futures
3. Waiting for the completion of only the quickest task in a set of Futures
4. Reacting to a Future completion via callback.

Хорошо описано в соответствующей главе "Java 8 In Action".
2 апр 19, 17:24    [21850430]     Ответить | Цитировать Сообщить модератору
 Re: Как использовать CompletableFuture  [new]
Molasar
Member

Откуда:
Сообщений: 584
st07mnn
Molasar
Прочитал, что можно использовать CompletableFuture, чтобы выполнение кода не приостанавливалось при future.get();
Где прочитали?

import java.util.concurrent.*;

public class CompletableFutureDemo {

    public static void main(String[] args) throws TimeoutException {
        final ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        final CompletableFuture<Long> future = CompletableFuture
                .supplyAsync(() -> new Fibo(45).call(), cachedThreadPool);
        try {
            System.out.println(future.get(500L, TimeUnit.MILLISECONDS));
        } catch (InterruptedException | ExecutionException e) {
            throw new RuntimeException(e);
        } finally {
            cachedThreadPool.shutdown();
        }
    }

}

class Fibo implements Callable<Long> {

    private int idx;

    public Fibo(int idx) {
        this.idx = idx;
    }

    @Override
    public Long call()  {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        return 1L;
    }
}


Примеры задач, для которых удобен класс CompletableFuture:
1. Combining two asynchronous computations in one
2. Waiting for the completion of all tasks performed by a set of Futures
3. Waiting for the completion of only the quickest task in a set of Futures
4. Reacting to a Future completion via callback.

Хорошо описано в соответствующей главе "Java 8 In Action".


NetBeans говорит необработанный Exception в методе Call()
.supplyAsync(() -> new Fibo(45).call(), cachedThreadPool);

try-catch и выбрасывание выше не помогают.
Как можно обработать Exception внутри функционального интерфейса?
3 апр 19, 10:25    [21850994]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить