DSAppTeam / Anchors

:white_check_mark: Anchors 是一个基于图结构,支持同异步依赖任务初始化 Android 启动框架。其锚点提供 "勾住" 依赖的功能,能灵活解决初始化过程中复杂的同步问题。参考 alpha 并改进其部分细节, 更贴合 Android 启动的场景, 同时支持优化依赖初始化流程, 自动选择较优的路径进行初始化。
Apache License 2.0
820 stars 79 forks source link

AnchorsManager#start()`的线程阻塞写法 #2

Closed mrme2014 closed 5 years ago

mrme2014 commented 5 years ago

AnchorsManager#start()的线程阻塞写法

while (AnchorsRuntime.hasAnchorTasks()) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            while (AnchorsRuntime.hasRunTasks()) {
                AnchorsRuntime.tryRunBlockRunnable();
            }
        }

改成下面这样,会不会更好呢?会不会有问题呢

while (AnchorsRuntime.hasAnchorTasks()) {
            try {
               synchronized (mLock){
                   mLock.wait(10);
               }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            while (AnchorsRuntime.hasRunTasks()) {
                AnchorsRuntime.tryRunBlockRunnable();
            }
        }
YummyLau commented 5 years ago

你这样写是没有问题的,同样等处理“主线程轮训等待运行任务而不出现anr”的问题。 项目的写法是让线程直接休眠而不放弃锁,而mlock.wait的写法是线程必须在mlock上进行同步,同时wait必须在同步块里面实现,会重复放弃锁再获取锁。 两者虽然效果上是一样的,但是sleep多用于业务上时间需要同步,而wait多用于多线程同步。这里没有涉及到多线程,用sleep更好。