让开发效率爆表的Guava ---- Concurrent并发

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<String> list = new ArrayList<String>();

    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<String> listenableFuture = (ListenableFuture<String>) executorService
				.submit(new Callable<String>() {
					public String call() throws Exception {
						return "task success ";
					}
				});

		/* Futrue初始版本

		// JDK 自带线程池
		//ExecutorService executor = Executors.newCachedThreadPool();

		// JDK Future
		Future<Integer> future = executor.submit(new Callable<Integer>() {
			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<String> {
	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();
	}
}
时间: 2024-12-15 08:12:53

让开发效率爆表的Guava ---- Concurrent并发的相关文章

让开发效率爆表的Guava ---- 基础工具篇

使用现成的库的原因, 既能减少自己开发所带来的bug, 同时又大大提高了开发效率, 当然这也是Java语言流行的一个原因----拥有海量的开源包. 本篇从Guava基础工具入手开始介绍这个广泛使用的库: package com.wenniuwuren.guava; import java.io.UnsupportedEncodingException; import java.util.Date; import java.util.HashMap; import com.google.commo

让开发效率爆表的Guava ---- Ordering排序工具

使用Guava的排序工具类, 快速实现对象的单变量排序和多变量排序, 让你的开发效率爆炸... import com.google.common.collect.Lists; import com.google.common.collect.Ordering; import com.google.common.primitives.Ints; import java.util.Collections; import java.util.Comparator; import java.util.I

让开发效率爆表的Guava ---- Table矩阵

使用Guava对矩阵的实现, 做一些矩阵存贮等操作将大大提高效率, 而不是自己用JDK的Array去实现, 可能带来不少bug, 而且增加代码复杂度. package com.wenniuwuren.collections; import java.util.Map; import com.google.common.collect.HashBasedTable; /** * Table: 矩阵的实现 * @author wenniuwuren * */ public class TableTe

让开发效率爆表的Guava ---- Maps

本文介绍了Guava集合类Maps的使用, 比如将具有唯一主键的对象快速存入Map等... package com.wenniuwuren.guava; import java.util.List; import java.util.Map; import java.util.NavigableMap; import java.util.Set; import com.google.common.base.Function; import com.google.common.collect.Li

让开发效率爆表的Guava ---- Lists列表

Guava对JDK  List的扩展, 方便增加list到list中, 方便拆分list package com.wenniuwuren.collections; import java.util.Iterator; import java.util.List; import com.google.common.collect.Lists; public class ListsTest { public static void main(String[] args) { Person perso

让开发效率爆表的Guava ---- FluentIterable迭代器

Guava提供了可以在Iterator中进行处理的功能更丰富的迭代器, 其实就像是加了一个代理, 增加一些功能. package com.wenniuwuren.collections; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.google.common.base.Function; import com.google.common.base.Joiner;

让开发效率爆表的Guava ---- Files文件操作

相信很多人最开始用JDK库对文件进行操作时, 都被繁琐重复的代码所恶心到, 当然这也是各种库出现的原因. 接下来介绍Guava的Files类, 提供了对文件操作的极大简化, 如程序员可以完全不用关心流的开关闭. 本文大致介绍了文件的复制.重命名.内容读取等对文件的基本操作. 代码示例: import com.google.common.base.Charsets; import com.google.common.collect.Lists; import com.google.common.h

让开发效率爆表的Guava ---- Sets

本问介绍了Guava中Sets集合类的一般使用情况, 例如集合的互斥. 交集. 并集等... package com.wenniuwuren.collections; import java.util.Iterator; import java.util.Set; import com.google.common.collect.Sets; /** * 对Sets工具类的使用 * @author wenniuwuren * */ public class SetsTest { public st

让开发效率爆表的Guava ---- EventBus事件驱动模型

在软件开发过程中, 难免有信息的共享或者对象间的协作. 如何让对象间信息共享高效, 并且耦合性低, 这是一个难题. 而耦合性高将带来编码修改牵一发而动全身的连锁效应, Spring的风靡正是因为解决了高耦合问题. 本篇介绍的EventBus中也用到了Spring中的依赖注入, 来进行对象和对象间的解耦(如@Subscribe). Guava解决高耦合采用的是事件驱动模型的思路, 对象可以订阅(subscribe)特定的事件或者发布(publish)特定的事件去被消费. 从下面的代码可以看出, E