美文网首页Java 杂谈
11.2基于guava的多线程

11.2基于guava的多线程

作者: 孔垂云 | 来源:发表于2017-05-23 00:08 被阅读0次

    guava是Google开发的java API,这里面有一节,封装了多线程的一些操作。相比原生java实现的多线程,guava实现的方式更为简单,也更容易掌握。

    下面看一下具体实现方法:

    添加依赖pom.xml

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

    GuavaMultiThread.java

    整个代码都在这个类里,下面分节解说

    /**
         * 生产车票
         *
         * @return
         */
        public List<String> createTickets() {
            List<String> list = new ArrayList<>();
            for (int i = 0; i < 100; i++) {
                list.add("车票" + i);
            }
            return list;
        }
    

    这里假设有100张车票

    public void sellTicket() {
            List<String> list = createTickets();//获取车票
    
            List<ListenableFuture<Integer>> futures = Lists.newArrayList();
            ExecutorService pool = Executors.newFixedThreadPool(10);//定义线程数
            ListeningExecutorService executorService = MoreExecutors.listeningDecorator(pool);
            for (int i = 0; i < list.size(); i++) {
                futures.add(executorService.submit(new Task(list.get(i))));
            }
    
            final ListenableFuture<List<Integer>> resultsFuture = Futures.successfulAsList(futures);
            try {//所有都执行完毕
                resultsFuture.get();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                System.out.println("操作完毕");
                pool.shutdown();
            }
        }
    

    这是具体多线程执行的方法,还是比较容易理解的。首先获取要售的票,然后定义futures ,用于获取线程执行的结果。定义线程池ExecutorService ,固定值,这里设为10,定义监听执行线程池的类ListeningExecutorService
    futures.add(executorService.submit(new Task(list.get(i))));这一句话就是开始执行多线程。

    最后定义ListenableFuture用于判断多线程什么时候全部执行完,全都执行完后,在finally里面执行pool.shutdown();,用于关闭线程池。这句话必须得要,不然当前线程池会一直处于启动状态。

    new Task(list.get(i),在这个类里, 定义了一个内部类,Task,用于拆分具体执行多线程的处理过程。

    /**
         * 内部类,用于处理售票
         */
        class Task implements Callable<Integer> {
            private String ticket;
    
            /**
             * 构造方法,用于参数传递
             *
             * @param ticket
             */
            public Task(String ticket) {
                this.ticket = ticket;
            }
    
            @Override
            public Integer call() throws Exception {
                System.out.println("已卖" + ticket);//执行卖票过程
                return 1;
            }
        }
    

    也比较简单,一个构造方法,用于传参数,这个类实现Callable接口,在这个接口的具体实现即call()方法里面进行具体业务逻辑的处理,都处理完后,返回1。

    处理结果如下所示:

    多线程处理

    多线程在实际工作中非常重要,能极大提高处理效率。在使用guava来开发多线程处理时,一共包括以下几个步骤:

    1、生成要处理的所有对象,放在List里面
    2、编写内部类,实现Callable接口,在这里面写具体业务逻辑
    3、多线程的设置及启动、关闭,这一段代码基本没啥变化,变的是第1、2点。

    源码下载

    本工程详细源码

    相关文章

      网友评论

        本文标题:11.2基于guava的多线程

        本文链接:https://www.haomeiwen.com/subject/qgaixxtx.html