guava使用(四)–线程类使用

  • Post author:
  • Post category:其他




guava使用(四)–线程类使用



一、简介

这一节介绍guava中线程类的使用。guava中ListenableFuture类(扩展自Future类)和Futures类提供了线程结果的监听、再处理、多线程处理。



二、jdk中线程使用

用于同guava中线程比较,这里以jdk中多线程使用为例。

//创建线程池
ExecutorService es = Executors.newFixedThreadPool(3);
List<String> strList = Lists.newArrayList("one", "two", "three");
//创建多个任务
List<Callable<String>> taskList = new ArrayList<>();
strList.forEach(t ->{
    taskList.add(()->t);
});
//执行所有任务
List<Future<String>> futureList = es.invokeAll(taskList);
//输出结果
futureList.forEach(t -> {
    try {
        System.out.println(t.get());
    } catch (Exception e) {}
});
//关闭线程池
es.shutdown();



三、guava准备



3.1 文档官网地址


文档官网地址

:


https://github.com/google/guava/wiki/ListenableFutureExplained



3.2 jar包

guava最新的jar包版本为27.1-jre。使用中可添加maven依赖:

<dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>27.1-jre</version>
</dependency>



四、guava中关键线程类和方法



4.1 MoreExecutors类

线程池工具类,常用方法有:

listeningDecorator(ExecutorService delegate): 构造线程池;



4.2 ListenableFuture类

扩展自Future类,添加了结果监听处理,方法为:

addListener(Runnable listener, Executor executor) : 结果处理;



4.3 Futures类

Future结果处理工具类。常用方法有:

transform : 对Future结果(无须等到结果)再次处理,返回新的Future;

addCallback:添加Future结果的回调方法,当结果出来时,调相应的结果处理方法;

allAsList:多个Future合并一个Future列表,顺序同输入一致,若其中有失败或取消,则整个Future为失败;

successfulAsList:多个Future合并一个Future列表,顺序同输入一致,若其中有失败或取消,则null替代;



五、示例



5.1 Future直接获取结果

//生成线程池
ListeningExecutorService les = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(3));
//创建单任务
Callable<String> call = () -> "test";
//任务处理
ListenableFuture<String> lf = les.submit(call);
//直接获取结果
String res = lf.get();



5.2 Future添加结果回调处理

//监听方式一:直接在future上添加结果处理
lf.addListener(()-> {
    try {
        System.out.println(lf.get());
    } catch (Exception e) {}
},les);


//监听方式二:通过工具类Futures来异步结果处理
Futures.addCallback(lf, new FutureCallback<String>() {
    //成功时处理
    @Override
    public void onSuccess(@Nullable String result) {
        System.out.println(Strings.lenientFormat("success, %s", result));
    }

    //失败处理
    @Override
    public void onFailure(Throwable t) {
        System.out.println(Strings.lenientFormat("fail, %s", t));
    }
},les);



5.3 对Future结果再次异步线程处理

//对Future结果再次处理,返回新的Future        
ListenableFuture<String> newFuture = Futures.transform(lf, input -> input+1, les);
//输出新Future结果
System.out.println(newFuture.get());



5.4 多Future结果处理



5.4.1 所有结果要么都成功,要么都失败
//生成线程池
ListeningExecutorService les = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(3));
List<String> list = Lists.newArrayList("one", "two", "three");
//创建Future列表
List<ListenableFuture<String>> fList = list.stream().map(t -> les.submit(()->t)).collect(toList());
//返回包含所有结果的Future,结果顺序与输入顺序是一致的,若其中有一个失败或取消,则整个Future为失败
ListenableFuture<List<String>> resFuList = Futures.allAsList(fList);
//获取所有Future结果
List<String> resList = resFuList.get();


5.4.2 对失败的结果以null代替
//返回包含所有结果的Future,结果与输入顺序是一致的,若其中有一个失败或取消,则其future包含的值用null代替
ListenableFuture<List<String>> succCombiner = Futures.successfulAsList(fList);



六、结尾

同前面文章类似,这里仅列出来部分操作,更多操作请查看源码。



版权声明:本文为chinabestchina原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。