参考:https://blog.csdn.net/u011001084/article/details/104037805

结论:参考文章的性能测出的结果 与我实际测试出的结果正好相反, 所以开发还是要实测为准。

添加依赖:

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>

基本用法:

public static void main(String[] args) throws ExecutionException, InterruptedException, IOException {
    Cache<String,String> cache1 =CacheBuilder.newBuilder()
            .expireAfterWrite(3,TimeUnit.SECONDS) // 若缓存项在给定的时间内没有被写访问,则回收(延时回收)。
            .expireAfterAccess(3,TimeUnit.SECONDS) // 若缓存项在给定的实际内没有被读访问,则回收(延时回收)。
            .weakValues() // 弱引用存储值,可垃圾回收
            .weakKeys() // 弱引用存储键,可垃圾回收
            .concurrencyLevel(8) // 并发级别,指同时支持写缓存的线程数
            .initialCapacity(10)  // 初始化容量
            .maximumSize(2000) // 最大存储上限,超过按照LRU算法移除缓存项
            .recordStats()  // 统计缓存的命中率
            .removalListener(new MyListener()) // 缓存的移除监听(监听到的是新值)
            .build();
    cache1.put("myKey","myValue");
    System.out.println("获取值:" + cache1.getIfPresent("myKey"));

    cache1.invalidate("myKey");
    System.out.println("获取我的key:" + cache1.get("myKey",()->"操作数据库"));

    Thread.sleep(5000);
    System.out.println("再次获取:" + cache1.get("myKey",()->"再次操作数据库"));

    cache1.put("myKey11","myValue11"); // 自然的过期,并不会触发监听
    Thread.sleep(5000);
    System.out.println(cache1.getIfPresent("myKey11"));
    System.in.read();
}

private static class MyListener implements RemovalListener<String,String>{
    @Override
    public void onRemoval(RemovalNotification<String, String> notification) {
        System.out.println("修改的key:" + notification.getKey());
        System.out.println("修改的值:" + notification.getValue());
        System.out.println("修改的原因:" + notification.getCause());
    }
}

以下是线程池的性能测试:
// Future的性能测试
public static void main(String[] args) {
    ExecutorService executor = Executors.newCachedThreadPool();
    long startTime = System.currentTimeMillis();
    GuavaMain guavaMain = new GuavaMain();

    List<Future<String>> futureList = Arrays.asList(executor.submit(() -> guavaMain.test1()),
            executor.submit(() -> guavaMain.test2()),
            executor.submit(() -> guavaMain.test3()),
            executor.submit(() -> guavaMain.test4()));
    List<String> collect = futureList.stream().map(future -> {
        try {
            return future.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        return null;
    }).collect(Collectors.toList());


    System.out.println("耗时:" + (System.currentTimeMillis() - startTime));
}

// CompletableFuture性能测试
public static void main4(String[] args) {
    ExecutorService executor = Executors.newCachedThreadPool();
    long startTime = System.currentTimeMillis();
    GuavaMain guavaMain = new GuavaMain();
    List<CompletableFuture<String>> futures = new ArrayList<>(4);
    futures.add(CompletableFuture.supplyAsync(() -> guavaMain.test1(),executor));
    futures.add(CompletableFuture.supplyAsync(() -> guavaMain.test2(),executor));
    futures.add(CompletableFuture.supplyAsync(() -> guavaMain.test3(),executor));
    futures.add(CompletableFuture.supplyAsync(() -> guavaMain.test4(),executor));

    CompletableFuture<Void> allFuture = CompletableFuture.allOf(futures.toArray(new CompletableFuture[4]));
    CompletableFuture<List<String>> listCompletableFuture = allFuture.thenApplyAsync(value -> futures.stream().map(CompletableFuture::join).collect(Collectors.toList()), executor);
    List<String> join = listCompletableFuture.join();

    System.out.println("耗时:" + (System.currentTimeMillis() - startTime));
}

//  guava性能测试
public static void main5(String[] args) throws ExecutionException, InterruptedException {
    ExecutorService executor = Executors.newCachedThreadPool();
    ListeningExecutorService guavaExecutor = MoreExecutors.listeningDecorator(executor);

    long startTime = System.currentTimeMillis();
    GuavaMain guavaMain = new GuavaMain();
    ListenableFuture<String> lf1 = guavaExecutor.submit(() -> guavaMain.test1());
    ListenableFuture<String> lf2 = guavaExecutor.submit(() -> guavaMain.test2());
    ListenableFuture<String> lf3 = guavaExecutor.submit(() -> guavaMain.test3());
    ListenableFuture<String> lf4 = guavaExecutor.submit(() -> guavaMain.test4());

    ListenableFuture<List<String>> listListenableFuture = Futures.allAsList(lf1, lf2, lf3, lf4);
    List<String> strings = listListenableFuture.get();


    System.out.println("耗时:" + (System.currentTimeMillis() - startTime));
}

private String test1(){
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "test1";
}

private String test2(){
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "test2";
}

private String test3(){
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "test3";
}

private String test4(){
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "test4";
}

 

posted on 2021-11-17 13:03  毛会懂  阅读(1227)  评论(0编辑  收藏  举报