首页 > 编程语言 >Java语言进阶

Java语言进阶

时间:2024-06-03 10:55:42浏览次数:20  
标签:异步 Redisson Java 进阶 获取 任务 CompletableFuture 执行 语言

异步任务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等方法获取异步任务的执行结果,或者处理异步任务的完成情况。
    示例:
    CompletableFuture future = CompletableFuture.supplyAsync(() -> {
    // 执行异步任务,并返回结果return "异步任务结果";
    });
    总之,runAsync用于执行没有返回值的异步任务,而supplyAsync用于执行有返回值的异步任务,并且可以通过后续的方法链来处理异步任务的结果或异常。

Redisson 锁

在 Java 中,使用 Redisson 锁可以通过以下步骤安全释放:

  1. 获取锁对象:使用Redisson的getLock方法获取锁对象。
  2. 释放锁:使用锁对象的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

相关文章