Closed mrme2014 closed 5 years ago
AnchorsManager#start()的线程阻塞写法
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(); } }
你这样写是没有问题的,同样等处理“主线程轮训等待运行任务而不出现anr”的问题。 项目的写法是让线程直接休眠而不放弃锁,而mlock.wait的写法是线程必须在mlock上进行同步,同时wait必须在同步块里面实现,会重复放弃锁再获取锁。 两者虽然效果上是一样的,但是sleep多用于业务上时间需要同步,而wait多用于多线程同步。这里没有涉及到多线程,用sleep更好。
AnchorsManager#start()
的线程阻塞写法改成下面这样,会不会更好呢?会不会有问题呢