vavr 的 Future 不执行一些代码,使用方法 andThen
vavr's Future don't execute some code, with method andThen
在这段代码中,我有两种使用 vavr 库的方法。从这个库中,我将 Future 与方法 andThen 一起使用,这个方法 运行 当 future 已经完成时,这是同步的,但是当线程调用这个方法中的方法 "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
但有时控制台是空的。
非常感谢:)
您的测试完成,主 JUnit
运行线程在 Future
完成之前退出 JVM。这就是为什么您在控制台上得到不一致结果的原因,这完全取决于 Future
s 的执行时间,从 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
在这段代码中,我有两种使用 vavr 库的方法。从这个库中,我将 Future 与方法 andThen 一起使用,这个方法 运行 当 future 已经完成时,这是同步的,但是当线程调用这个方法中的方法 "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
但有时控制台是空的。
非常感谢:)
您的测试完成,主 JUnit
运行线程在 Future
完成之前退出 JVM。这就是为什么您在控制台上得到不一致结果的原因,这完全取决于 Future
s 的执行时间,从 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