首页 > 编程语言 >Java工具库Guava并发相关工具类的使用示例

Java工具库Guava并发相关工具类的使用示例

时间:2022-11-22 09:44:46浏览次数:62  
标签:ExecutorService Java 示例 System submit println 工具 executorService out

场景

Java核心工具库Guava介绍以及Optional和Preconditions使用进行非空和数据校验:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127683387

Java中ExecutorService线程池的使用(Runnable和Callable多线程实现):

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126242904

在上面分别使用Java的ExecutorService以及Guava的入门介绍,看一下Guava中对于并发

的相关工具类的使用。

Guava 定义了ListenableFuture接口并继承了 JDK concurrent 包下的 Future 接口。

ListeningExecutorService接口继承于juc中的ExecutorService接口,对ExecutorService做了一些扩展,

看其名字中带有Listening,说明这个接口自带监听的功能,可以监听异步执行任务的结果。

通过MoreExecutors.listeningDecorator创建一个ListeningExecutorService对象,需传递一个ExecutorService参数,

传递的ExecutorService负责异步执行任务。

传统 JDK 中的 Future 通过异步的方式计算返回结果:在多线程运算中可能或者可能在没有结束返回结果,

Future 是运行中的多线程的一个引用句柄,确保在服务执行返回一个 Result。

ListenableFuture 可以允许你注册回调方法(callbacks),在运算(多线程执行)完成的时候进行调用,

或者在运算(多线程执行)完成后立即执行。这样简单的改进,使得可以明显的支持更多的操作,

这样的功能在 JDK concurrent 中的 Future 是不支持的。

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

执行单个任务并添加回调-通过submit.addListener

    @Test
    public void test1() throws ExecutionException, InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        try {

            ListeningExecutorService listeningExecutorService = MoreExecutors.listeningDecorator(executorService);
            ListenableFuture<Integer> submit = listeningExecutorService.submit(() -> {
                System.out.println(System.currentTimeMillis());
                TimeUnit.SECONDS.sleep(2);
                System.out.println(System.currentTimeMillis());
                return 10;
            });

            submit.addListener(()-> System.out.println("任务执行成功,进入回调"),MoreExecutors.directExecutor());
            System.out.println("任务执行结果:"+submit.get());
        }finally {
            executorService.shutdown();
        }
    }

执行单个任务并添加回调-通过Futures.addCallback

    @Test
    public void test1() throws ExecutionException, InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        try {

            ListeningExecutorService listeningExecutorService = MoreExecutors.listeningDecorator(executorService);
            ListenableFuture<Integer> submit = listeningExecutorService.submit(() -> {
                System.out.println(System.currentTimeMillis());
                TimeUnit.SECONDS.sleep(2);
                System.out.println(System.currentTimeMillis());
                return 10;
            });

            //写法一
            //        submit.addListener(()-> System.out.println("任务执行成功,进入回调"),MoreExecutors.directExecutor());
            //        System.out.println("任务执行结果:"+submit.get());

            //写法二
            //通过调用Futures的静态方法addCallback在异步执行的任务中添加回调,回调的对象是一个FutureCallback,此对象有2个方法,
            // 任务执行成功调用onSuccess,执行失败调用onFailure。
            Futures.addCallback(submit, new FutureCallback<Integer>() {
                @Override
                public void onSuccess(@Nullable Integer integer) {
                    System.out.println("执行成功");
                }
                @Override
                public void onFailure(Throwable throwable) {
                    System.out.println("执行失败:" + throwable.getMessage());
                }
            }, MoreExecutors.directExecutor());

            System.out.println("任务执行结果:" + submit.get());
        }finally {
            executorService.shutdown();
        }
    }

执行多个任务并获取所有的结果Futures.allAsList

    @Test
    public void test2() throws ExecutionException, InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        try {
            List<ListenableFuture<Integer>> futureList = new ArrayList<>();
            ListeningExecutorService listeningExecutorService = MoreExecutors.listeningDecorator(executorService);
            for (int i = 0; i < 5; i++) {
                int finalI = i;
                Future<?> submit = listeningExecutorService.submit(() -> {
                    TimeUnit.SECONDS.sleep(finalI);
                    return finalI;
                });
                futureList.add((ListenableFuture<Integer>) submit);
            }
            List<Integer> integers = Futures.allAsList(futureList).get();
            integers.stream().forEach(System.out::println);
        }finally {
            executorService.shutdown();
        }
    }

标签:ExecutorService,Java,示例,System,submit,println,工具,executorService,out
From: https://www.cnblogs.com/badaoliumangqizhi/p/16914155.html

相关文章

  • Java NIO编程实例
     文章目录前言一、NIO与BIO的比较二、Buffer的机制及其子类1.Buffer的使用2.Buffer的四个基本类型三、Channel的使用1.Channel的特征2.Channel的子......
  • java学习
     一、前言1、JRE和JDKJREJava程序的运行环境,包含JVM(Java虚拟机)和运行时所需要的核心类库JDKJava程序开发工具包,包含JRE和开发人员使用的工具(编译工具:javac.ex......
  • Java - HuTool工具的介绍与使用(总)
    本篇主要介绍HuTool工具,其是java工具类,对于一些静态方法进行封装,虽然很小,但很全,里面拥有平时我们会用到的工具类,就无需我们自己去封装了以前我还自己去封装,emmm,我真的......
  • Java Swing 学习记录
    目录参考资料什么是Swing?Swing和AWTSwing组件1JFrame窗口2JPanel面板3LayoutManager布局管理器3.1边框布局管理器3.2流式布局管理器3.3卡片布局管理器3.4网......
  • 【云原生】Kubernetes(k8s)Calico 客户端工具 calicoctl
    目录一、概述二、calicoctl安装三、calicoctl简单使用1)认证信息配置2)查看IP资源池3)配置IP池4)IP资源池示例演示5)固定IP示例演示6)网络策略(NetworkPolicy)四、Kube-ip......
  • 硬盘坏道检测工具对比(DiskGenius/HdTunePro/MHDD等)
    说到硬盘检测软件,大家肯定会想到MHDD,但是MHDD真的好用?反正我觉得太难用了,只能在DOS下运行,不能在Win系统下运行;最重要的是只支持IDE硬盘模式,现在的主板几乎全部默认都是AHCI......
  • Javac编译器
    Javac编译器Java技术下的编译期在不同的语境下会有不同的编译器实现产品:1、前端编译器:jdk的javac、EclipseJDT中的增量式编译器2、即时编译器:hotspot虚拟机中的c1、c2......
  • java15源码-ThreadPoolExecutor
    一Executors工具类创建ThreadPoolExecutorSingleThreadExecutornewFixedThreadPoolnewCachedThreadPoolnewScheduledThreadPoolnewSingleThreadScheduledExecuto......
  • JAVA-动漫美女拼图游戏
    代码1packagecom.itheima_02;publicclassApp{publicstaticvoidmain(String[]args){PictureFramepf=newPictureFrame();}}代码2p......
  • openkylin基础 工具箱 查看整机信息
          OS:openKylin-0.7.5-x86_64      blog:师万物 工具箱查看整机信息硬件参数硬件监测驱动管理 学习资源openKylin(开放麒麟)ope......