vavr的Future不会使用andThen方法执行某些代码

时间:2018-06-28 20:04:09

标签: java multithreading future vavr vavr-test

在这段代码中,我有两种使用vavr库的方法。从该库中,我将Future与方法andThen一起使用,当future完成后,此方法运行,并且此方法是同步的,但是当对该方法中的方法“ printTime”进行线程调用时,所有程序均停止,并且测试为成功。 这是方法

    @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());
    });

}

这是测试

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

最终在方法printTime中的结果是:

Montoya
pool-1-thread-1

,并且方法是:

{{1}}

但是稍后控制台是空的。

非常感谢:)

1 个答案:

答案 0 :(得分:0)

您的测试完成,并且JUnit主运行线程在Future完成之前退出了JVM。这就是为什么您在控制台上获得不一致的结果的原因,这完全取决于Future的执行时间,从vavr 0.9.2开始,它发生在cached thread pool中。

如果您想同步等待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