美文网首页
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

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