CompletableFuture是否保证运行新线程?
给定一些任意的上下文(例如 Junit 单元测试,而不是特定的,不一定是“主”线程)。
像这样的代码必须引入至少 2 个线程吗?
public static void main (String[] args)
{
CompletableFuture<Void> s = new CompletableFuture<>();
CompletableFuture<Void> f = new CompletableFuture<>();
CompletableFuture<Void> someContext = CompletableFuture.supplyAsync(() ->
{
try{
System.out.println(Thread.currentThread().getId());
CompletableFuture<String> update =
CompletableFuture.supplyAsync(
() -> {
String ans = null;
try {
System.out.println(Thread.currentThread().getId());
ans = "Hello";
} catch (Exception e) {
ans = e.toString();
} finally {
s.complete(null);
return ans;
}
});
s.get();
System.out.println(s.isDone());
} catch (Exception e) {
System.out.println("Some error");
return null;
}
return null;
});
System.out.println(f.isDone());
}
当我们进入时s.get(),someContextJVM 能否检测到它正在等待 -> 上下文切换以update完成它,然后切换回someContext?
在ideone 中运行它时,它始终在两个不同的线程中运行它们,但这只是单一观察。
我想了解语言/运行时提供的保证。