await
和 wait
在编程中经常被提及,但它们实际上来自不同的上下文,并具有不同的用途。下面我会详细解释它们的基础概念、区别、应用场景以及可能遇到的问题和解决方法。
notify()
方法或 notifyAll()
方法。IllegalMonitorStateException
。CompletableFuture
类中的一个方法,也用于异步编程。wait
主要用于线程间的通信和同步,而 await
用于异步编程和并发任务的协调。wait
是Java语言内置的关键字,必须在同步上下文中使用;await
是 CompletableFuture
类的方法,属于Java并发API的一部分。wait
会导致当前线程阻塞,直到被唤醒;await
也会阻塞调用线程,但它是非阻塞的,因为它等待的是异步任务的结果。wait
时可能遇到的问题:wait
和 notify
,可能会导致死锁。wait
和 notify
,并且遵循一定的顺序来避免循环等待。await
时可能遇到的问题:await
方法会重新抛出这个异常。try-catch
块来捕获和处理可能的异常。synchronized (lockObject) {
while (<condition does not hold>) {
lockObject.wait();
}
// 执行操作
}
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// 执行耗时操作
return "result";
});
try {
String result = future.await(); // 等待并获取结果
} catch (Exception e) {
// 处理异常
}
请注意,上述 await
方法的使用是不准确的,因为 CompletableFuture
实际上并没有名为 await
的方法。正确的方法是使用 get()
来阻塞等待结果,或者使用 thenAccept()
、thenApply()
等方法来处理异步结果,而不阻塞主线程。这里是一个修正后的示例:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// 执行耗时操作
return "result";
});
future.thenAccept(result -> {
// 处理结果,不会阻塞主线程
});
在实际应用中,推荐使用 thenAccept
或 thenApply
这样的非阻塞方法来处理异步任务的结果。
领取专属 10元无门槛券
手把手带您无忧上云