生产消费模型
Timer.java
多生产、单消费、支持任务优先级、周期定时
while(true){
if queue.isEmpty() then queue.wait()
task = queue.getMin()
if (System.currentTimeMillis() >= task.nextExecutionTime) then taskFired = true
if(taskFired && period ) then addTask()
if(!taskFired) then queue.wait()
if(taskFired) then task.run()
}
- 如何响应插入高优Task?queue排序后有新增高优则notify,唤醒消费线程再次执行新的循环。(需要唤醒消费Thead么?)
- 如何获取最优task?最小堆排序
- 当系统时间被调节到2022年,taskFired永远为true,Timer将串行、无间隔、连续执行。造成QPS突增。尽量用SystemClock中的BootTime
HandlerThread.java
多生产、单消费、支持任务优先级。
HandlerThread\Looper\MessageQueue\Message\ThreadLocal\Messenger
- 由MQ.next()内部死循环保证返回最高优先级msg或者Null,while(true)内支持 延时、激活优先级重判、消费链表。
- ThreadLocal保证每个线程只有一个Looper,线程安全则是由底层保证的。
- Message有对象复用机制。
- Messenger可处理跨进程。
- 不存在Timer的问题,因为内部用的是SystemClock.uptimeMillis(),修改时钟不影响定时间隔的判断。
ThreadLocal Thread 1:N
Thread ThreadLocalMap 1: 1
ThreadLocalMap Value 1:1
ThreadPoolExecutor.java
参数含义 https://www.jianshu.com/p/d2729853c4da
任务队列管理、线程池管理
删除线程、任务 getTask() 中空队列超时后,返回Null,结束Thread死循环
新增线程、任务 execute()中不大于核心线程数、队列满了但是小于最大线程数
阻塞队列的作用很重要,接口分阻塞(put)、timeout阻塞(offer(timeout))、非阻塞(offer)、非阻塞异常(add)
FutureTask.java
可用于多线程同步
AQS CAS
数值的内存地址、期望expect、新值update
锁是什么,就是一个数字,0代表有资源
公平锁非公平锁
乐观和悲观
await 和 signal
读写锁和
由阻塞队列 到 等待队列
AQS其他应用
AtomicInteger
CountDownLatch(心思)共享节点。
BlockingQueue
优先级、高并发、链表的
Shark线程模型
应用层、网络层、协议层,借助session和唯一id做到request和response配对,对抹平http和socket应用层差异有帮助,因为socket是异步的
RxJava线程模型
装饰模式
两个过程构建过程和执行过程。构建过程分『去』和『回』,去的过程将productor组织成链表,相当于缠毛线,回的过程是构建consumer链,把通过subscribe进来的消费者作为内层消费者,还是缠毛线。最后是执行过程,按照开发者的流程执行。
执行线程在构建过程『回』的环节开始起作用,在执行过程的起点,确定好线程。
消费线程是在执行过程起作用,并且可以切换过程中的线程。
Observable.from(subject2)
.map(new Func1<String, String>() {
@Override
public String call(String s) {
System.out.println("1 " + Thread.currentThread().getName());
return s + " map";
}
})
.observeOn(Schedulers.newThread())
.map(new Func1<String, String>() {
@Override
public String call(String s) {
System.out.println("2 " + Thread.currentThread().getName());
return s;
}
})
.observeOn(Schedulers.newThread())
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
System.out.println("3 " + Thread.currentThread().getName());
System.out.println(s);
}
});
09-06 08:10:50.923 1450-1450/com.smarking.myapplication I/System.out: 1 main
09-06 08:10:50.923 1450-1450/com.smarking.myapplication I/System.out: 1 main
09-06 08:10:50.923 1450-1450/com.smarking.myapplication I/System.out: 1 main
09-06 08:10:50.923 1450-1450/com.smarking.myapplication I/System.out: onNext
09-06 08:10:50.923 1450-1450/com.smarking.myapplication I/System.out: map op
09-06 08:10:50.923 1450-1450/com.smarking.myapplication I/System.out: 在里面-353518519 铁布衫 new
09-06 08:10:50.923 1450-1450/com.smarking.myapplication I/System.out: map op
09-06 08:10:50.923 1450-1450/com.smarking.myapplication I/System.out: 在里面2108156674 十八掌 new
09-06 08:10:50.923 1450-1450/com.smarking.myapplication I/System.out: map op
09-06 08:10:50.923 1450-1450/com.smarking.myapplication I/System.out: 在里面455487043 飞檐走壁 new
09-06 08:10:50.923 1450-1450/com.smarking.myapplication I/System.out: onCompleted bef
09-06 08:10:50.923 1450-1450/com.smarking.myapplication I/System.out: onCompleted after
09-06 08:10:50.923 1450-1747/com.smarking.myapplication I/System.out: 2 RxNewThreadScheduler-4
09-06 08:10:50.923 1450-1747/com.smarking.myapplication I/System.out: 2 RxNewThreadScheduler-4
09-06 08:10:50.923 1450-1747/com.smarking.myapplication I/System.out: 2 RxNewThreadScheduler-4
09-06 08:10:50.923 1450-1746/com.smarking.myapplication I/System.out: 3 RxNewThreadScheduler-3
09-06 08:10:50.923 1450-1746/com.smarking.myapplication I/System.out: 铁布衫 map
09-06 08:10:50.923 1450-1746/com.smarking.myapplication I/System.out: 3 RxNewThreadScheduler-3
09-06 08:10:50.923 1450-1746/com.smarking.myapplication I/System.out: 十八掌 map
09-06 08:10:50.923 1450-1746/com.smarking.myapplication I/System.out: 3 RxNewThreadScheduler-3
09-06 08:10:50.923 1450-1746/com.smarking.myapplication I/System.out: 飞檐走壁 map
网络
连接池采用引用计数
RealConnection 和 StreamAllocation 相互依赖,应用层依赖StreamAllocation,RealConnection依赖socket。并且RealConnection形成了连接池自己记录着有多少。
RealConnection依赖Socket
请求方法, 请求地址, 请求协议, 请求头, 请求体
请求头 https://www.jianshu.com/p/ca8a982a116b
WebSocket 请求切换协议、加解密操作
设计模式
开发态:高复用、低耦合、高扩展、低维护
运行态:高性能、高吞吐
https://mp.weixin.qq.com/s/Mf4R3IxpQAmhDjyYzrS7sw
分层架构模式还是隔离业务复杂度与技术复杂度的利器,分层的目的是隔离变化、职责更单一。
强哥的建议MT有两个工作方法论是:
- 沟通:观点先行,论据支撑,层层递进,重点突出
- 分析:不重不漏,多个方案比较,列出优劣
你们先讨论,然后给个结论,按上述#1的方式,然后讲下分析过程,按#2的方式
View
自定义View layout、measure、draw
自定义动画的原理
点击事件的分发
Android启动
启动Activity的流程
Fragment的启动流程
Dex Mutildex
Gradle相关
Jvm
GC的原理
ART 和 Devik的不同
优化 内存流畅度
算法与数据结构
项目
DL
https://km.sankuai.com/page/57609260
链表的操作
数据结构 HashMap ArrayMap
在线支付
https://km.sankuai.com/page/60009538
https://km.sankuai.com/page/43955622
全家桶项目
美团外卖
组件化
Crash治理
内存治理
租车项目
DL
Websocket 网路
算法与数据结构还有阻塞队列
基建 科技 物
Fragment在onHidendChanged后是否重新走Fragment的生命周期?不走。
MultiSourcePresenter
提供数据源
数据聚合、分页逻辑、业务和页面分离
BucketResponseDispatcher.getInstance().setListView(this);
mBaseOperatePresenter = new BaseOperatePresenter(this);
mMultiSourcePresenter = new MultiSourcePresenter(this);
模式切换
WaimaiMessageDispatcher.getInstance().setAutoModel(isAutoMode);
BucketResponseDispatcher.getInstance().setAutoModel(isAutoMode);
有Fragment情况下的自动接单和手动接单(美团、饿了么)
无Fragment被Hinde的情况下的自动接单和手动接单
Fragment被销毁的情况下自动接单和手动接单
手动mode要做啥
网友评论