11.2基于guava的多线程

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

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

添加依赖pom.xml

 
      com.google.guava
      guava
      21.0
 

GuavaMultiThread.java

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

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

这里假设有100张车票

public void sellTicket() {
        List list = createTickets();//获取车票

        List> 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> 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 {
        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。

处理结果如下所示:

11.2基于guava的多线程_第1张图片
多线程处理

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

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

源码下载

本工程详细源码

你可能感兴趣的:(11.2基于guava的多线程)