11.2基于guava的多线程

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点。

源码下载

本工程详细源码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,264评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,355评论 19 139
  • 周末两天半时间上了陈桦老师的Tech mark(管理实战模拟)的课程,这是许多商学院EMBA课程的必学之课。老师会...
    933ddf8604ee阅读 8,722评论 0 0
  • 全栈工程师,也叫全端工程师,英文Full Stack developer,是指掌握多种技能,并能利用多种技能独立完...
    醉馬当前闯阅读 5,946评论 0 11
  • 一个早上,说是要以小的出门,早早就把垃圾放出门,到我和小的要出门,打开门,门外面的一幕让我呆了:不知是那位,把门边...
    华华雯雯阅读 728评论 2 0