title | date | tags | categories | |
---|---|---|---|---|
Guava |
2018-11-21 02:56:52 -0800 |
|
💠
💠 2024-10-25 18:09:58
Github地址
官方手册git clone https://github.com/google/guava.wiki.git
翻译版
Guava Guide
Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 collections 、缓存 caching 、原生类型支持 [primitives support] 、并发库 concurrency libraries 、通用注解 common annotations 、字符串处理 string processing 、I/O 等等。 所有这些工具每天都在被Google的工程师应用在产品服务中。
包结构
com.google.common.annotations
com.google.common.base
com.google.common.collect
com.google.common.io
com.google.common.net
com.google.common.primitives
com.google.common.util.concurrent
Optional的设计和Java8的Optional是差不多的,Java8可能是参考的Guava。
但是api设计上没有 Caffeine 灵活
令牌桶算法实现
Beta 状态,官方TODO优化为nano级别,降低存储成本
// 快速使用
EventBus eventBus = new EventBus();
eventBus.register(new Object() {
@Subscribe
public void hehe(Integer num) throws InterruptedException {
System.out.println(num + ":" + System.currentTimeMillis());
Thread.currentThread().sleep(100);
}
});
eventBus.post(1);
注意 只使用
@Subscribe
注解的话,如果有两个同类事件触发,也是要排队执行的,因为包装的是Subscriber.SynchronizedSubscriber
实现,同类事件并发执行需要加上@AllowConcurrentEvents
基础组件
- Executor : EventBus#executor 默认是当前线程,通常指定自定义线程池
- SubscriberRegistry : Subscriber注册器,每个带有@Subscribe的方法会被注册到该类中
- Dispatcher : 调度器,负责将事件,分发给事件对应的Subscriber,使用Executor执行这些Subscriber
- PerThreadQueuedDispatcher 执行线程内将会按事件发布顺序进行消费, 执行线程间仍异步乱序。
ThreadLocal<Queue>
实现线程间队列隔离 - LegacyAsyncDispatcher 默认用于 AsyncEventBus,异步实现即可能出现不同的线程不同的事件消费顺序,同一线程对先后发布的事件消费顺序也可能不一致,注释都说这个有没有必要用队列 emmm
- ImmediateDispatcher 无队列,立即投送事件给Subscriber,积压在Executor的队列中, 事件的消费可能有序可能无序取决于不同的Subscriber实现
- PerThreadQueuedDispatcher 执行线程内将会按事件发布顺序进行消费, 执行线程间仍异步乱序。
- SubscriberExceptionHandler : 异常处理器