在Android中,Thread.currentThread().getId()和Process.myTid()有什么区别?

4

众所周知:

myTid() - 返回调用线程的标识符,可与 setThreadPriority(int, int) 一起使用。

但我发现 Thread.currentThread().getId() 不等于 Process.myTid()。因此,我猜前者是 JVM 版本的线程 ID,后者是 Linux 版本的线程 ID。

我对吗?如果是这样,为什么 Java 要创建自己的线程 ID,而不使用 Linux 的线程 ID 呢?

更新:

经过进一步的研究和阅读 Android 源代码,我有了新的认识:

Process.myTid() 是一个与平台(操作系统)相关的操作,Process.setThreadPriority() 也是如此,在 Android 的本地级别源代码中,它们都调用了一个系统调用来实现目标。

但是 Java 是一种与平台无关的语言,Java 不强制主机操作系统需要一个“tid”或 getTid() 方法,因为另一个操作系统可能通过字符串键(只是一个示例,:)) 来标识其线程。然后 Java 用自己的方式标识其线程,在 Java 范围内分配唯一的线程 ID,如果 Java 提供了一个静态 API,如 Process.setThreadPriority(),那么 Java 范围的 ID 明显将是一个参数,但我们不需要这样做,因为我们可以通过调用 Thread 对象方法 setPriority(int priority) 来实现这一点。

欢迎任何评论。

更新:

所有答案都是正确的。但是 fadden 的评论让我更加清晰。谢谢大家。


@EJP Process.myPid() 返回进程 ID。Process.myTid() 是另一回事。 - Eng.Fouad
1
Linux线程有一个进程ID(也称为线程组ID)和一个线程ID。Dalvik线程具有内部16位线程ID,这是必要的,因为Dalvik需要一个短线程标识符,并且不能假设操作系统会提供它(参见:Mac OS X)。java.lang.Thread具有自己的ID,它可能与其他ID之一相同,但实际上并不相同。所以...随便选吧。 - fadden
2个回答

0

Thread.getId() : 返回 id;

其中 id 被赋值为:

Thread.create : id = ++Thread.count

因此,Process.myTid() 是“系统 tid”,而 Thread.getId() 是“Java 线程 id”


0

我相信在Java环境中有两种类型的线程:

  • 本地线程:由托管的操作系统管理。
  • Java线程:由JVM管理,并与本地线程通信。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接