一直有个疑问,即多个apk 同时调用同一个系统服务中的同一个接口时,会不会发生阻塞? (实际上之前看过这方面的内容,知道不会,但自己从来没亲自验证过,这次就来个了结)
今天自己在系统中添加了系统服务,然后让多个apk 来调用。
Android 中自定义了系统服务,添加了一个接口,接口中延迟了20s来观察是否阻塞
public void testTwo(String key) {
Slog.d(TAG,"phg__ testTwo key " + key);
try {
Thread.sleep(20000); // 延迟 20s
} catch (Exception e){
Slog.d(TAG,"phg__ testTwo err ");
}
Slog.d(TAG,"phg__ testTwo ");
}
通过log 看,两个apk,分别调用 testTwo 函数,android 系统会启动两个线程来执行各自任务,不会出现 一个apk执行完,另一个apk 才执行的情况。
行 1351: 08-04 16:10:57.648 1178 2648 D QueryList: phg__ testTwo key two
行 2692: 08-04 16:11:00.505 1178 2154 D QueryList: phg__ testTwo key two
行 5228: 08-04 16:11:17.648 1178 2648 D QueryList: phg__ testTwo
行 6735: 08-04 16:11:20.505 1178 2154 D QueryList: phg__ testTwo
这是由于binder 机制决定的,binder有一个线程池,当接受的binder 调用后,会开启一个线程来执行该任务,不会出现一个线程一直运行着的情况。