Будущее vavr не выполняет некоторый код с помощью метода andThen

В этом коде у меня есть два метода, использующих библиотеку vavr. Из этой библиотеки я использую Future с методом andThen, этот метод запускается, когда будущее завершено, и это происходит синхронно, но когда поток вызывает метод "printTime" в этом методе, все программы останавливаются, и тест успех. это метод

    public void printTime(String m){
    String pattern = "HH:mm:ss:SSS";
    SimpleDateFormat formato = new SimpleDateFormat(pattern);
    Date date = new Date();
    String dateString = formato.format(date);
    String retorno = dateString+" "+m;
    System.out.println(retorno);
}

и это тест

    @Test
public void futuroAndThen() {
    Future<String> f1 = Future.of(()->"Julian");
    Future<String> f2 = Future.of(()->"Carvajal");
    Future<String> f3 = Future.of(()->"Montoya");

    Future<String> fResult = f3.andThen(x-> {
        System.out.println(x.get());
        System.out.println(Thread.currentThread().getName());
        printTime("andThen2"+Thread.currentThread().getName());
    }).andThen(y->{
        System.out.println("y:"+y.get());
        System.out.println(Thread.currentThread().getName());
        f2.andThen(x->{
            System.out.println("f2: "+x.get());
            System.out.println("thread f2 "+Thread.currentThread().getName());
        });
        printTime("andThen2"+Thread.currentThread().getName());
    });

}

наконец, результат в методе printTime:

Montoya
pool-1-thread-3
y:Montoya
pool-1-thread-1
f2: Carvajal
thread f2 pool-1-thread-3

и с помощью метода:

Montoya
pool-1-thread-1

но в некоторые моменты консоль пуста.

большое спасибо вам:)

1 ответ

Решение

Ваш тест заканчивается и основной JUnit поток бегуна выходит из JVM до того, как Future мог закончить. Вот почему вы получаете противоречивые результаты на консоли, все зависит от времени выполнения Futures, которые - с vavr 0.9.2 - происходят в кэшированном пуле потоков.

Если вы хотите синхронно ждать Future чтобы быть завершенным, вы можете использовать

fResult = fResult.await();

в конце вашего теста. Тогда ваш тест будет ждать Future экземпляры, чтобы закончить, и ваш вывод будет:

Montoya
pool-1-thread-4
23:56:59:570 andThen2pool-1-thread-4
y:Montoya
pool-1-thread-3
f2: Carvajal
thread f2 pool-1-thread-4
23:56:59:572 andThen2pool-1-thread-3
Другие вопросы по тегам