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)
Uid是相同的,因为它的应用程序特定的沙箱Pid:每个应用程序都是一个 ProcessonCreate一样Pid,因为它是UIThread为基于Linux和Android操作系统,我们知道,问题就Process实际上是Thread等等......而在Async中ThreadId是不同的,因为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线程IDThread.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层"静态长自动递增.| 归档时间: |
|
| 查看次数: |
1717 次 |
| 最近记录: |