美文网首页
2018-09-04

2018-09-04

作者: SMSM | 来源:发表于2018-09-04 15:36 被阅读18次

生产消费模型

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()
  }
  1. 如何响应插入高优Task?queue排序后有新增高优则notify,唤醒消费线程再次执行新的循环。(需要唤醒消费Thead么?)
  2. 如何获取最优task?最小堆排序
  3. 当系统时间被调节到2022年,taskFired永远为true,Timer将串行、无间隔、连续执行。造成QPS突增。尽量用SystemClock中的BootTime

HandlerThread.java

多生产、单消费、支持任务优先级。
HandlerThread\Looper\MessageQueue\Message\ThreadLocal\Messenger

  1. 由MQ.next()内部死循环保证返回最高优先级msg或者Null,while(true)内支持 延时、激活优先级重判、消费链表。
  2. ThreadLocal保证每个线程只有一个Looper,线程安全则是由底层保证的。
  3. Message有对象复用机制。
  4. Messenger可处理跨进程。
  5. 不存在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. 分析:不重不漏,多个方案比较,列出优劣
    你们先讨论,然后给个结论,按上述#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要做啥

相关文章

  • 2018-09-04

    2018-09-04 万千工品金秀 2018-09-04 00:21 · 字数 932 · 阅读 0 · 日记本 ...

  • 2018-09-04

    戴师傅 2018-09-04 2018-09-04 20:32 打开App (稻盛哲学学习会)打卡第126天 姓名...

  • 180904

    2018-09-04 #The Sense of Style The Sense of Style is not ...

  • 柳叶湖

    柳叶湖 胡99(胡建中) 2018-09-04 柳叶湖畔柳丝纤 ...

  • 统计日志记录最少天数

    NVIDIA笔试2018-09-04思路 统计日志记录最少天数 题目: InputThe first input ...

  • 西点新品上市简书

    上市时间:2018-09-04 1、市场活动 2、系统内操作 3、验收标准及保质期

  • A股主要指数的市盈率(PE)估值高度

    中证1000(SH000852)- 2018-09-04日, 当前值:21.0969, 平均值:51.25, 中位...

  • 来了去

    来了 成来过 又来 涂抹足迹 去不 了 以宽 阔容 恩慈时光 静默 解 2018-09-04

  • 懂你 L4-U1-4-Listening-QuickServe2

    流利说 D69 2018-09-04 一 一、复习 Level4-Unit1-Part3*Game-Speakin...

  • 数组去重排序

    NVIDIA笔试2018-09-04思路 题目:数组去重排序 Example: 样例输入 样例输出 解析 输入输入...

网友评论

      本文标题:2018-09-04

      本文链接:https://www.haomeiwen.com/subject/fgigwftx.html