Android:Process.myTid()VS Thread.currentThread()。getId()

时间:2015-10-16 13:27:54

标签: android android-asynctask

我有简单的Activity来调用AsyncTask,因此我会打印一些关于ProcesThread的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
  1. Uid相同,因为其app-specific sandbox
  2. Pid类似:Each app is one Process
  3. onCreate中的第3行与Pid相同,因为它是UIThread,而在Android操作系统中基于Linux,我们知道有关Process的问题实际上是{{1}在Thread中,AsyncThreadId不同,因为AsyncTask在不同的Thread而不是UIThread
  4. 上运行

    我正在努力理解的是Thread.currentThread().getId()。我期望在同一个执行环境中获得与Thread.currentThread().getId()相同的id。例如对于onCreate我希望第3,4行相同(29776),而对于Async,我希望第3,4行是相同的(30426)。这是怎么回事?

    谢谢,

1 个答案:

答案 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层"每个线程的静态长度自动递增。