2015-10-16 96 views
3

我已經簡單Activity調用AsyncTask,所以我就打印和Proces一些Thread的ID:安卓:Process.myTid()VS Thread.currentThread()的getId()

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 oneProcess
  3. onCreate 3號線相同Pid因爲它是UIThread和Android操作系統爲基於Linux,我們知道關於Process實際上是Thread等這個問題......而在AsyncThreadId是不同的,因爲AsyncTask不同Thread運行而不是在UIThread

我很難理解的是Thread.currentThread().getId()。我期望的是在相同的執行環境下獲得與Thread.currentThread().getId()相同的id。例如對於onCreate我希望3,4行相同(29776),對於Async我希望行3,4相同(30426)。這裏發生了什麼?

謝謝,

+0

什麼'AsyncTask'方法你記錄ID? – Onik

+0

@Onik'onCreate'(Activity)正在調用常規'new SomeTask()。execute();'哪個是常規Android'AsyncTask' – michael

+0

當然!你記錄的ID?如果是這樣,我明白你記錄的方法之一是'Activity'的'onCreate()'。另一個(在'AsyncTask'中)是什麼? – Onik

回答

12

非常有趣的問題由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()返回調用者的線程ID(TID)。在單線程 進程中,線程ID等於進程ID(PID,由getpid(2)返回 )。在多線程進程中,所有線程都具有相同的PID,但每個線程都有一個唯一的TID。

  • 這意味着,Process.myTid()由Linux內核給出返回線程ID。

另一方面,Thread.getId()只是返回一個long。這個長度在init(...)期間被賦值爲tid = nextThreadId();。然後這個難題的最後一塊,下列是爲nextThreadId()

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

private static synchronized long More ...nextThreadID() { 
    return ++threadSeqNumber; 
} 
  • 代碼這意味着,Thread.getId()是一個簡單的「Java的層」靜態長爲自動增量爲每個線程。
+1

好答案!... – michael