我有简单的Activity
来调用AsyncTask
,因此我会打印一些关于Proces
和Thread
的ID:
From onCreate android.os.Process.myUid(): 10137
From onCreate android.os.Process.myPid(): 29776
From onCreate android.os.Process.myTid(): 29776
From onCreate Thread.currentThread().getId(): 1
/****************************************************************/
From Async doInBackground android.os.Process.myUid(): 10137
From Async doInBackground android.os.Process.myPid(): 29776
From Async doInBackground android.os.Process.myTid(): 30426
From Async doInBackground Thread.currentThread().getId(): 12556
Uid
相同,因为其app-specific sandbox Pid
类似:Each app is one Process
onCreate
中的第3行与Pid
相同,因为它是UIThread
,而在Android操作系统中基于Linux,我们知道有关Process
的问题实际上是{{1}在Thread
中,Async
与ThreadId
不同,因为AsyncTask
在不同的Thread
而不是UIThread
我正在努力理解的是Thread.currentThread().getId()
。我期望在同一个执行环境中获得与Thread.currentThread().getId()
相同的id。例如对于onCreate
我希望第3,4行相同(29776),而对于Async
,我希望第3,4行是相同的(30426)。这是怎么回事?
谢谢,
答案 0 :(得分:13)
OP非常有趣的问题,我决定挖掘(爱开源)。
简短的回答是:他们之所以不同,是因为他们不同,因为他们从来都不是一样的。
Process.myTid()
是linux线程ID Thread.getId()
是一个简单的顺序long
号。但简短的回答很无聊,所以让我们探讨答案的来源(答案中的链接指向相关的源代码)。
在Process.myTid()
中,您只会看到Os.gettid()
来自Libcore
的调用本身在Linux Programmer's Manual上调用该方法的方法如下:
public static int gettid() { return Libcore.os.gettid(); }
此外Os.gettid();
的文档您将找到指向Thread.getId()
gettid()返回调用者的线程ID(TID)。在单线程中 进程,线程ID等于进程ID(PID,返回 通过getpid(2))。在多线程进程中,所有线程都具有相同的 PID,但每个都有一个唯一的TID。
Process.myTid()
返回Linux内核给出的线程ID。另一方面,tid = nextThreadId();
只是返回long
。在init(...)
期间nextThreadId()
分配此长整数。然后,这个谜题的最后一部分是{{3}}
/* For generating thread ID */
private static long threadSeqNumber;
private static synchronized long More ...nextThreadID() {
return ++threadSeqNumber;
}
Thread.getId()
只是一个" java层"每个线程的静态长度自动递增。