gpt4 book ai didi

安卓:Process.myTid() VS Thread.currentThread().getId()

转载 作者:太空宇宙 更新时间:2023-11-03 11:36:54 28 4
gpt4 key购买 nike

我有一个调用 AsyncTask 的简单 Activity,所以我打印了一些关于 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 流程
  3. onCreate 中的第 3 行与 Pid 相同,因为它是 UIThread 并且在基于 Linux 的 Android 操作系统中我们知道关于 Process 实际上是 Thread 等...而在 AsyncThreadId 是不同的,因为 AsyncTask 在不同的 Thread 而不是 UIThread
  4. 上运行

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

谢谢,

最佳答案

OP 提出的非常有趣的问题,我决定深入挖掘(热爱开源)。

简短的回答是:它们之所以不同,是因为它们不同,因为它们本来就不是相同的。

  • Process.myTid()为linux线程ID
  • Thread.getId() 是一个简单的连续 long 数字。

但是简短的答案很无聊,所以让我们探索一下答案的来源(答案中的链接指向相关的源代码)。

Process.myTid() ,您会看到这只是来自 Os.gettid() 的调用它本身在 Libcore 上调用本地方法该方法如下:

public static int gettid() { return Libcore.os.gettid(); }

此外还有 Os.gettid(); 的文档,您会找到指向 Linux Programmer's Manual 的链接

gettid() returns the caller's thread ID (TID). In a single-threaded process, the thread ID is equal to the process ID (PID, as returned by getpid(2)). In a multithreaded process, all threads have the same PID, but each one has a unique TID.

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

另一方面Thread.getId()只是返回一个long。此 long 在 init(...) 期间分配为 tid = nextThreadId(); .然后是这个拼图的最后一 block ,下面是 nextThreadId() 的代码

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

private static synchronized long More ...nextThreadID() {
return ++threadSeqNumber;
}
  • 这意味着,Thread.getId() 只是一个“java 层”静态长期为每个线程自动递增。

关于安卓:Process.myTid() VS Thread.currentThread().getId(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33171734/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com