parent
10429c85af
commit
d066d53e48
@ -0,0 +1,97 @@ |
||||
--- |
||||
怎么检查线程有耗时任务? |
||||
--- |
||||
|
||||
#### 检测机制 |
||||
|
||||
1. WatchDog |
||||
2. BlockCanary |
||||
|
||||
#### WatchDog |
||||
|
||||
1. 检查是否发生了死锁 |
||||
2. 检查线程是否被任务 blocked |
||||
|
||||
```java |
||||
private void startOtherServices(){ |
||||
final Watchdog watchdog = Watchdog.getInstance(); |
||||
mActivityManagerService.systemReady(new Runnable(){ |
||||
@Override |
||||
public void run(){ |
||||
Watchdog.getInstance().start(); |
||||
} |
||||
}) |
||||
} |
||||
public class Watchdog extends Thread{...} |
||||
|
||||
private Watchdog(){ |
||||
super("watchdog"); |
||||
mMinitorChecker = new HandlerChecker(FgThread.getHandler(), ...); |
||||
mHandlerCheckers.add(mMinitorChecker); |
||||
mHandlerCheckers.add(new HandlerCheck(new Handler(Looper.getMainLooper()), ...)); |
||||
mHandlerCheckers.add(new HandlerChecker(UiThread.getHandler(), ...)); |
||||
mHandlerCheckers.add(new HandlerChecker(IoThread.getHandler(), ...)); |
||||
mHandlerCheckers.add(new HandlerChecker(DisplayThread.getHandler(), ...)); |
||||
|
||||
addMonitor(new BinderThreadMonitor()); |
||||
} |
||||
``` |
||||
|
||||
```java |
||||
private static final class BinderThreadMonitor implements Watchdog.Monitor{ |
||||
@Override |
||||
public void monitor(){ |
||||
Binder.blockUntilThreadAvailable(); |
||||
} |
||||
} |
||||
void Binder_blockUntilThreadAvailable(JNIEnv* env, jobject clazz){ |
||||
return IPCThreadState::self()->blockUntilThreadAvailable(); |
||||
} |
||||
void IPCThreadState::blockUntilThreadAvailable(){ |
||||
pthread_mutex_lock(&mProcess->mThreadCountLock); |
||||
while(mProcess->mExecutingThreadsCount>=mProcess->mMaxThreads){ |
||||
pthread_cond_wait(&mProcess->mThreadCountDecrement, &mProcess->mThreadCountLock); |
||||
} |
||||
pthread_mutext_unlock(&mProcess->mThreadCountLock); |
||||
} |
||||
status_t IPCThreadState::getAndExecuteCommand(){ |
||||
talkWithDriver(); |
||||
cmd = mIn.readInt32(); |
||||
mProcess->mExecutingThreadsCount++; |
||||
executeCommand(cmd); |
||||
mProcess->mExecutingThreadsCount--; |
||||
mpthread_cond_broadcast(&mProcess->mThreadCountDecrement); |
||||
} |
||||
``` |
||||
|
||||
```java |
||||
// Watchdog#run |
||||
public void run(){ |
||||
while(true){ |
||||
for(int i=0;i<mHandlerCheckers.size();i++){ |
||||
HandlerChecker hc = mHandlerCheckers.get(i); |
||||
hc.scheduleCheckLocked(); |
||||
} |
||||
} |
||||
} |
||||
public void scheduleCheckLocked(){ |
||||
if(mMonitors.size()==0&&mHandler.getLooper().getQueue().isPolling()){ |
||||
mCompleted = true; |
||||
return; |
||||
} |
||||
if(!mCompleted){ |
||||
return; |
||||
} |
||||
mCompleted = false; |
||||
mCurrentMonitor = null; |
||||
mStartTime = SystemClock.uptimeMillis(); |
||||
mHandler.postAtFromOfQueue(this); |
||||
} |
||||
``` |
||||
|
||||
```java |
||||
public ActivityManagerService(Context systemContext){ |
||||
Watchdog.getInstance().addMonitor(this); |
||||
Watchdog.getInstance().addThread(mHandler); |
||||
} |
||||
``` |
Loading…
Reference in new issue