异步任务CompletableFuture
CompletableFuture.runAsync和CompletableFuture.supplyAsync都是用于创建异步任务的方法,但它们之间有一些重要的区别:
1. CompletableFuture.runAsync:
- 用于执行没有返回值的异步任务,即Runnable接口实例。
- 适用于那些只需要执行异步操作,而不需要返回结果的情况。
- 无法获取异步任务的执行结果,因为它没有返回值。
示例:
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
// 执行异步任务,没有返回值
});
在runAsync中传入的Runnable接口实例会在一个新的线程中执行,但是你可能需要对异步任务的完成进行处理,以便在需要时获取结果或处理异常。
你可以使用thenRun方法来在异步任务完成后执行一个操作,或者使用exceptionally方法来处理异步任务的异常情况。下面是一个修改后的示例代码:
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
MetadataTaskUtils.addMetadataLog();
});
future.thenRun(() -> {
System.out.println("异步任务执行完成");
}).exceptionally(ex -> {
System.out.println("异步任务执行出现异常: " + ex.getMessage());
return null; // 返回一个默认值,以便链式调用
});
在这个示例中,我们使用thenRun方法在异步任务完成后打印一条消息,同时使用exceptionally方法处理异步任务的异常情况。这样可以更好地控制异步任务的执行流程。
2. CompletableFuture.supplyAsync:
- 用于执行有返回值的异步任务,即Supplier接口实例。
- 适用于那些需要执行异步操作并返回结果的情况。
- 可以通过thenApply、thenAccept等方法获取异步任务的执行结果,或者处理异步任务的完成情况。
示例:
CompletableFuturefuture = CompletableFuture.supplyAsync(() -> {
// 执行异步任务,并返回结果return "异步任务结果";
});
总之,runAsync用于执行没有返回值的异步任务,而supplyAsync用于执行有返回值的异步任务,并且可以通过后续的方法链来处理异步任务的结果或异常。
Redisson 锁
在 Java 中,使用 Redisson 锁可以通过以下步骤安全释放:
- 获取锁对象:使用Redisson的getLock方法获取锁对象。
- 释放锁:使用锁对象的unlock方法释放锁。
示例代码如下:
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
public class RedissonLockExample {
private static final String LOCK_KEY = "myLock";
public static void main(String[] args) {
// 创建配置
Config config = new Config();
config.useSingleServer().setAddress("redis://localhost:6379");
// 创建Redisson客户端
RedissonClient client = Redisson.create(config);
// 获取锁对象
RLock lock = client.getLock(LOCK_KEY);
try {
// 尝试获取锁,最多等待10秒,持有锁时间为30秒
boolean acquired = lock.tryLock(10, 30, TimeUnit.SECONDS);
if (acquired) {
// 成功获取到锁
// TODO: 执行共享资源的操作
} else {
// 未能获取到锁
// TODO: 处理获取锁失败的逻辑
}
} catch (InterruptedException e) {
// 处理中断异常
Thread.currentThread().interrupt();
} finally {
// 释放锁
lock.unlock();
}
// 关闭Redisson客户端
client.shutdown();
}
}
在上述代码中,首先创建了一个Redisson客户端,并通过getLock方法获取了一个锁对象。然后,使用tryLock方法尝试获取锁,如果获取成功,则执行共享资源的操作;如果获取失败,则处理获取锁失败的逻辑。最后,在finally块中使用unlock方法释放锁。
标签:异步,Redisson,Java,进阶,获取,任务,CompletableFuture,执行,语言 From: https://www.cnblogs.com/running-future/p/18228328