博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Guava ---- Concurrent并发
阅读量:6407 次
发布时间:2019-06-23

本文共 4048 字,大约阅读时间需要 13 分钟。

  Guava在JDK1.5的基础上, 对并发包进行扩展。 有一些是易用性的扩展(如Monitor)。 有一些是功能的完好(如ListenableFuture)。 再加上一些函数式编程的特性, 使并发包的灵活性极大的提高...

Monitor的使用:

import com.google.common.util.concurrent.Monitor;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.concurrent.atomic.AtomicBoolean;/** * Monitor类语义和 synchronized 或者 ReentrantLocks是一样的, 仅仅同意一个线程进入 */public class MonitorSample {    private static final int MAX_SIZE = 3;    private Monitor monitor = new Monitor();    private List
list = new ArrayList
(); Monitor.Guard listBelowCapacity = new Monitor.Guard(monitor) { @Override public boolean isSatisfied() { return list.size() < MAX_SIZE; } }; public void addToList(String item) throws InterruptedException { // 超过MAX_SIZE, 会锁死 //monitor.enterWhen(listBelowCapacity); // 超过返回false 不会锁死 Boolean a = monitor.tryEnterIf(listBelowCapacity); try { list.add(item); } finally { // 确保线程会推出Monitor锁 monitor.leave(); } } public static void main(String[] args) { MonitorSample monitorSample = new MonitorSample(); for (int count = 0; count < 5; count++) { try { monitorSample.addToList(count + ""); } catch (Exception e) { System.out.println(e); } } Iterator iteratorStringList = monitorSample.list.iterator(); while (iteratorStringList.hasNext()) { System.out.println(iteratorStringList.next()); } }}

Future的扩展: 可识别的返回结果。 可改变的返回结果

package com.wenniuwuren.listenablefuture;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;import com.google.common.util.concurrent.FutureCallback;import com.google.common.util.concurrent.Futures;import com.google.common.util.concurrent.ListenableFuture;import com.google.common.util.concurrent.MoreExecutors;/** * 在使用ListenableFuture前, 最好看下JDK的Future使用 *  * @author wenniuwuren * */public class ListenableFutureTest {	public static void main(String[] args) {        				// Guava封装后带有执行结束监听任务执行结束的功能		ExecutorService executorService =				MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(5));				ListenableFuture
listenableFuture = (ListenableFuture
) executorService .submit(new Callable
() { public String call() throws Exception { return "task success "; } }); /* Futrue初始版本号 // JDK 自带线程池 //ExecutorService executor = Executors.newCachedThreadPool(); // JDK Future Future
future = executor.submit(new Callable
() { public Integer call() throws Exception { return 1; } }); // JDK Future真正获取结果的地方 try { Integer count = future.get(); } catch (Exception e) { e.printStackTrace(); }*/ /* listenableFuture 结束监听版本号 // 相比JDK的Future等待结果, Guava採用监听器在任务完毕时调用 // 可是有个缺陷, 对最后完毕的结果没法对操作成功/失败进行处理, 即run方法没返回值 listenableFuture.addListener(new Runnable() { @Override public void run() { System.out.println("执行完毕"); } }, executorService);*/ // 执行成功。将会返回 "task success successfully" 攻克了listenableFuture 结束监听版本号不能对结果进行操作问题 FutureCallbackImpl callback = new FutureCallbackImpl(); // 和计算结果同步执行 //Futures.addCallback(listenableFuture, callback); //假设计算较大, 结果的訪问使用异步 将会使用executorService线程去异步执行 Futures.addCallback(listenableFuture, callback, executorService); System.out.println(callback.getCallbackResult()); }}class FutureCallbackImpl implements FutureCallback
{ private StringBuilder builder = new StringBuilder(); @Override public void onSuccess(String result) { builder.append(result).append("successfully"); } @Override public void onFailure(Throwable t) { builder.append(t.toString()); } public String getCallbackResult() { return builder.toString(); }}

转载地址:http://uatea.baihongyu.com/

你可能感兴趣的文章
8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现...
查看>>
第一次发博客-说说我的B/S开发框架(asp.net mvc + web api + easyui)
查看>>
python之路之线程,进程,协程
查看>>
ZROI2018提高day3t1
查看>>
VC的水波效果
查看>>
微信支付SDK集成
查看>>
如何使用wepy和 vant-weapp开发小程序
查看>>
Angular7教程-03-Angular常用操作(上)
查看>>
洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here
查看>>
【python】python的列表表达式或解析式,帅就一个字
查看>>
聊聊 Spring Boot 2.x 那些事儿
查看>>
写Markdown费事?Typora让你像写word一样行云流水,所见即所得。
查看>>
TCP协议中的三次握手和四次挥手(图解)
查看>>
实例分析ASP.NET在MVC5中使用MiniProfiler监控MVC性能的方法 
查看>>
iOS 之 Core Data实践 1
查看>>
Jexus 5.8.2 正式发布为Asp.Net Core进入生产环境提供平台支持
查看>>
简单使用游标插入数据
查看>>
爬虫与多线程
查看>>
day06-python元祖
查看>>
as3字型的使用
查看>>