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

mic*_*ael 3 android android-asynctask

我有简单的Activity调用AsyncTask,所以我打印一些关于Proces和的ID Thread:

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
Run Code Online (Sandbox Code Playgroud)
  1. Uid是相同的,因为它的应用程序特定的沙箱
  2. 类似于Pid:每个应用程序都是一个 Process
  3. 在第3行onCreate一样Pid,因为它是UIThread为基于Linux和Android操作系统,我们知道,问题就Process实际上是Thread等等......而在AsyncThreadId是不同的,因为AsyncTask在不同的运行Thread而不是在UIThread

我正在努力理解的是Thread.currentThread().getId().我期望获得与Thread.currentThread().getId()相同执行环境相同的id .例如,因为onCreate我希望第3,4行是相同的(29776),因为Async我希望第3,4 行是相同的(30426 ).这里发生了什么?

谢谢,

Bud*_*ius 13

OP的非常有趣的问题我决定挖掘(爱开源).

简短的回答是:它们是不同的,因为它们是不同的,因为它们从来就不是一样的.

  • Process.myTid() 是linux线程ID
  • Thread.getId()是一个简单的long序号.

但简短的回答很无聊,所以让我们来探讨答案的来源(答案中的链接指向相关的源代码).

Process.myTid(),您将看到简单的调用Os.gettid()本身调用该方法的本机方法Libcore如下:

public static int gettid() { return Libcore.os.gettid(); }
Run Code Online (Sandbox Code Playgroud)

此外,Os.gettid();您可以找到Linux程序员手册的链接

gettid()返回调用者的线程ID(TID).在单线程进程中,线程ID等于进程ID(PID,由getpid(2)返回).在多线程进程中,所有线程都具有相同的PID,但每个线程都具有唯一的TID.

  • 这意味着,Process.myTid()返回Linux内核给出的线程ID.

另一方面Thread.getId()只是返回一个long.这个长期在init(...)as 期间分配tid = nextThreadId();.然后是这个谜题的最后一部分,下面是代码nextThreadId()

/* For generating thread ID */
private static long threadSeqNumber;

private static synchronized long More ...nextThreadID() {
    return ++threadSeqNumber;
}
Run Code Online (Sandbox Code Playgroud)
  • 这意味着,Thread.getId()每个线程只是一个"java层"静态长自动递增.