Будущее vavr не выполняет некоторый код с помощью метода andThen - PullRequest
0 голосов
/ 28 июня 2018

В этом коде у меня есть два метода, использующих библиотеку 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 Ответ

0 голосов
/ 29 июня 2018

Ваш тест заканчивается, и основной поток бегуна JUnit выходит из JVM до завершения Future. Вот почему вы получаете противоречивые результаты на консоли, все зависит от времени выполнения Future s, которое - с 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
...