2015-10-16 71 views
0

Activity通过调用生成2个相同ClassAsyncTaskAndroid:为什么不同的AsyncTask有不同的TID?

new SomeTask().execute(); 
new SomeTask().execute(); 

当调试 - 调用从doInBackgroundandroid.os.Process.myTid()我得到他们中的每一个不同的TID。这意味着每个AsyncTask正在执行不同的Thread

但似乎有悖于docs说法:

与蜂窝开始,任务小号在单个线程执行...

这到底是怎么解释呢?

目标API:23

运行于:22

敏API:15

编译:23

感谢,

回答

3

myTid()返回线程ID,而不是过程ID,如the documentation中所述。两个并行AsyncTask线程的线程ID将有所不同。

UPDATE:在为什么两个线程ID不同的方面,如果你看一下the source code to AsyncTask,与​​使用的ExecutorSerialExecutor默认。这实际上不是一个单一线程的线程池,而是围绕主多线程的线程池(THREAD_POOL_EXECUTOR),我们通常用executeOnExecutor()使用序列化包装。该线程池在开始时使用几个线程进行初始化(核心数+1)。我的猜测是,THREAD_POOL_EXECUTOR只是将后续作业交给线程循环,这会导致单独的线程ID。

想一想​​的更好的方法是一次只能运行一个AsyncTask,而不一定所有这样的AsyncTask实例都会在同一个线程上运行。

+0

但该文档说,除非你在执行运行,你有2个线程:1的UI和1为“普通工人”为所有其他的AsyncTask的等等'Process'这里没有相关的(这是每个应用程序及其1个过程ui线程,因为它是基于linux和线程=进程) – michael

+1

@michael:啊,现在我明白你的担心了。你在运行什么版本的Android?你的'targetSdkVersion'是什么? “过程在这里不相关” - 除了你是谁提出来的(“我得到不同的PID”)。进程ID(PID)和线程ID(TID)是不同的东西,你的问题似乎混合并匹配它们。 – CommonsWare

+0

对不起,我的意思TID ... – michael

相关问题