中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

異步加載緩存數據Java線程非阻塞優化

發布時間:2024-11-08 18:27:39 來源:億速云 閱讀:80 作者:小樊 欄目:編程語言

在Java中,異步加載緩存數據并實現線程非阻塞優化可以通過多種方式來實現。以下是一些常見的方法:

1. 使用CompletableFuture

CompletableFuture是Java 8引入的一個強大的異步編程工具,可以用來處理異步任務。

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class AsyncCacheLoader {
    private final Cache<String, String> cache = new ConcurrentHashMap<>();

    public CompletableFuture<String> loadAsync(String key) {
        return CompletableFuture.supplyAsync(() -> {
            // 模擬從數據庫或其他數據源加載數據
            return fetchDataFromDataSource(key);
        });
    }

    public String get(String key) {
        return cache.computeIfAbsent(key, this::loadAsync)
                     .thenApply(CompletableFuture::join)
                     .orTimeout(10, TimeUnit.SECONDS)
                     .exceptionally(ex -> {
                         System.err.println("Error loading data for key: " + key);
                         return null;
                     });
    }

    private String fetchDataFromDataSource(String key) {
        // 模擬從數據庫或其他數據源加載數據
        try {
            Thread.sleep(1000); // 模擬耗時操作
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        return "Data for key: " + key;
    }

    public static void main(String[] args) {
        AsyncCacheLoader cacheLoader = new AsyncCacheLoader();
        cacheLoader.get("key1").thenAccept(System.out::println);
    }
}

2. 使用ExecutorService

ExecutorService是一個線程池,可以用來執行異步任務。

import java.util.concurrent.*;

public class AsyncCacheLoader {
    private final Cache<String, String> cache = new ConcurrentHashMap<>();
    private final ExecutorService executorService = Executors.newFixedThreadPool(10);

    public Future<String> loadAsync(String key) {
        return executorService.submit(() -> {
            // 模擬從數據庫或其他數據源加載數據
            return fetchDataFromDataSource(key);
        });
    }

    public String get(String key) {
        return cache.computeIfAbsent(key, this::loadAsync)
                     .get();
    }

    private String fetchDataFromDataSource(String key) {
        // 模擬從數據庫或其他數據源加載數據
        try {
            Thread.sleep(1000); // 模擬耗時操作
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        return "Data for key: " + key;
    }

    public static void main(String[] args) {
        AsyncCacheLoader cacheLoader = new AsyncCacheLoader();
        try {
            System.out.println(cacheLoader.get("key1"));
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        } finally {
            cacheLoader.executorService.shutdown();
        }
    }
}

3. 使用ConcurrentHashMapcomputeIfAbsent方法

ConcurrentHashMap提供了computeIfAbsent方法,可以在緩存未命中時異步加載數據。

import java.util.concurrent.*;

public class AsyncCacheLoader {
    private final Cache<String, String> cache = new ConcurrentHashMap<>();
    private final ExecutorService executorService = Executors.newFixedThreadPool(10);

    public String get(String key) {
        return cache.computeIfAbsent(key, key -> {
            // 模擬從數據庫或其他數據源加載數據
            CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
                return fetchDataFromDataSource(key);
            }, executorService);

            future.thenApply(data -> {
                cache.put(key, data);
                return data;
            });

            return future;
        });
    }

    private String fetchDataFromDataSource(String key) {
        // 模擬從數據庫或其他數據源加載數據
        try {
            Thread.sleep(1000); // 模擬耗時操作
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        return "Data for key: " + key;
    }

    public static void main(String[] args) {
        AsyncCacheLoader cacheLoader = new AsyncCacheLoader();
        System.out.println(cacheLoader.get("key1"));
    }
}

4. 使用ScheduledExecutorService進行定時刷新

如果需要定期刷新緩存數據,可以使用ScheduledExecutorService

import java.util.concurrent.*;

public class AsyncCacheLoader {
    private final Cache<String, String> cache = new ConcurrentHashMap<>();
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    public AsyncCacheLoader() {
        scheduler.scheduleAtFixedRate(this::refreshCache, 0, 5, TimeUnit.SECONDS);
    }

    public String get(String key) {
        return cache.get(key);
    }

    private void refreshCache() {
        // 模擬從數據庫或其他數據源加載數據
        for (String key : cache.keySet()) {
            CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
                return fetchDataFromDataSource(key);
            }, executorService);

            future.thenApply(data -> {
                cache.put(key, data);
                return data;
            });
        }
    }

    private String fetchDataFromDataSource(String key) {
        // 模擬從數據庫或其他數據源加載數據
        try {
            Thread.sleep(1000); // 模擬耗時操作
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        return "Data for key: " + key;
    }

    public static void main(String[] args) {
        AsyncCacheLoader cacheLoader = new AsyncCacheLoader();
        System.out.println(cacheLoader.get("key1"));
    }
}

通過這些方法,可以實現異步加載緩存數據并確保線程非阻塞,從而提高系統的性能和響應速度。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兰西县| 佛坪县| 湘阴县| 潼南县| 大田县| 象州县| 江陵县| 介休市| 库车县| 定南县| 华蓥市| 乐亭县| 桐柏县| 奎屯市| 右玉县| 仙居县| 东兴市| 绵阳市| 玛沁县| 台中县| 盐山县| 孟连| 景泰县| 枣阳市| 潜江市| 开平市| 汉寿县| 定远县| 昆山市| 玛多县| 楚雄市| 邹平县| 偏关县| 剑川县| 苍南县| 大宁县| 蒲江县| 宁晋县| 新宁县| 丰原市| 长治县|