美文网首页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