线程
MonitorFilter 获得 monitor reference
获得 reference 是个耗时操作, MonitorCreator 是 Callable ,FutureTask 需要 get() 获取结果,dubbo 是通过添加callback 来实现的,这样不用阻塞当前线程,实现类是 listenableFutureTask ,通过名字可以看出来,添加了Listener来获得结果,需要关注2个地方
1.
覆盖了 FutureTask 的 done() 方法
done表明线程已完成
2.
另外一个是 ExecutionList ,以后在分析,在获取 monitor reference 对象场景下,我觉得有点复杂。
ListenableFutureTask 和 guava 的实现一样
ForkingClusterInvoker 发起多个请求,只有一个成功即返回
关键 : ref.poll(timeout, TimeUnit.MILLISECONDS);
只取第一个结果,并且控制超时。可以通过 forks 参数控制向多少个机器发起请求, timeout 参数控制超时时间。
锁
ReentrantLock 可重入锁
使用重入锁进行加锁是一种显式操作,通过何时加锁与释放锁使重入锁对逻辑控制的灵活性远远大于synchronized关键字。
com.alibaba.dubbo.container.Main 中,有ReentrantLock 配合 Condition 使用。
1. Runtime.addShutdownHook(Thread hook)方法,可以注册一个JVM关闭的钩子,这个钩子可以在以下几种场景被调用
1. 程序正常退出
2. 使用System.exit()
3. 终端使用Ctrl+C触发的中断
4. 系统关闭
5. 使用Kill pid命令干掉进程
2. Main 主线程, STOP.await(); 等待退出通知
应用程序无法保证shutdownHook总是运行的 (VM crash、kill -9、Runime.halt(),shutdownHook都无法运行 )
可以有多个shutdownHook,但其执行顺序无法保证
----------
Lock的await/singal 和 Object的wait/notify 的区别、比较
https://blog.csdn.net/zhang199416/article/details/70771238
https://www.cnblogs.com/alphablox/archive/2013/01/20/2868479.html
http://www.cnblogs.com/csuwater/p/5411693.html
网友评论