Java Future对象用于获取异步计算的结果,异步计算由并行线程(Executors)执行。我们调用Future.get()方法并等待,直到结果准备好为止。此示例显示了从Future检索结果的非阻塞方式。java实现了java无阻塞期货。
NonBlockingExecutor executor = new NonBlockingExecutor(Executors.newSingleThreadExecutor());
NonBlockingFuture<Integer> future = executor.submitNonBlocking(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
String threadName = Thread.currentThread().getName();
System.out.println(threadName);
//print -> pool-1-thread-1
return 1;
}
});
future.setHandler(new FutureHandler<Integer>() {
@Override
public void onSuccess(Integer value) {
String threadName = Thread.currentThread().getName();
System.out.println(threadName);
//print -> pool-1-thread-1
}
@Override
public void onFailure(Throwable e) {
System.out.println(e.getMessage());
}
});
Thread.sleep(50000);
在这个onSuccess()方法中,是在并行执行完成后调用的。问题是onSuccess()方法没有在主线程上运行。我想在主线程上执行onSuccess()方法。我该怎么解决这个问题。感谢
CompletableFutures支持此功能。
CompletableFuture.runAsync(() -> {
String threadName = Thread.currentThread().getName();
System.out.println(threadName);
//print -> pool-1-thread-1
}).whenComplete((task, throwable) -> {
if(throwable != null) {
System.out.println(e.getMessage());
} else {
String threadName = Thread.currentThread().getName();
System.out.println(threadName);
//print -> pool-1-thread-1
}
});
这里需要注意的是,未来将在执行线程而不是提交线程上运行whenComplete
任务。
Future
的要点是在单独的线程中执行相关的计算。onSuccess
方法是该独立线程表示已完成计算的一种方式。主线程调用onSuccess
是没有意义的,因为主线程不执行计算,也不知道计算何时完成。
在主线程中,如果希望等待计算完成并获得结果,请调用get()
。如果您想检查计算是否完成,如果还没有完成,则继续执行其他操作,请调用isDone()
或get(long, TimeUnit)
。如果要终止计算(无论计算是否完成),请调用cancel()
。
我想在主线程上执行onSuccess()方法。我该怎么解决这个问题。
你不能。Java中没有任何东西可以让线程停止它正在做的事情,做一会儿其他事情,然后回到它正在做什么。有些编程环境有这样的功能——Unix信号,硬件中断