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

У меня есть простая Activity которая вызывает AsyncTask , поэтому я печатаю некоторые идентификаторы в отношении Proces and 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 
  1. Uid такой же, потому что его специальная песочница
  2. Подобно Pid : каждое приложение представляет собой один Process
  3. 3-я строка в onCreate же, как Pid потому что это UIThread и в ОС Android, поскольку на базе Linux мы знаем, что проблема, касающаяся Process , фактически является UIThread и т. Д. … И в Async ThreadId отличается от того, что AsyncTask работает на разных Thread а не в UIThread

То, что я пытаюсь понять, это Thread.currentThread().getId() . Я ожидаю получить тот же идентификатор, что и Thread.currentThread().getId() для той же среды исполнения. Например, для onCreate Я хочу, чтобы строки 3,4 были одинаковыми (29776), а для Async я ожидаю, что строки 3,4 будут одинаковыми (30426). Что здесь происходит?

Благодаря,

Очень интересный вопрос OP, и я решил копать (люблю с открытым исходным кодом).

Короткий ответ: они разные, потому что они разные, потому что они никогда не должны были быть одинаковыми.

  • Process.myTid() – это идентификатор потока linux
  • Thread.getId() – это простое последовательное long число.

Но короткий ответ скучен, поэтому давайте исследуем, откуда приходит ответ (ссылки в ответах указывают на соответствующие исходные коды).

В Process.myTid() вы увидите, что это просто вызовы из Os.gettid() которые сами по себе называет собственный метод для Libcore для этого метода:

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

Кроме того, документы для Os.gettid(); Вы найдете ссылку на Руководство программиста Linux

Gettid () возвращает идентификатор потока вызывающего абонента (TID). В однопоточном процессе идентификатор потока равен идентификатору процесса (PID, возвращаемому getpid (2)). В многопоточном процессе все потоки имеют одинаковый PID, но каждый имеет уникальный TID.

  • Это значит, что Process.myTid() возвращает идентификатор потока, заданный ядром Linux.

С другой стороны Thread.getId() просто возвращает long . Этот long присваивается во время init(...) как tid = nextThreadId(); , Затем последний фрагмент этой головоломки, ниже – это код для nextThreadId()

 /* For generating thread ID */ private static long threadSeqNumber; private static synchronized long More ...nextThreadID() { return ++threadSeqNumber; } 
  • Это означает, что Thread.getId() – это просто «java-слой», статический длинный, являющийся автоматическим приращением для каждого потока.