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

Tengo Activity simple que llama AsyncTask , así que AsyncTask algunos id's con respecto a Proces y 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 es el mismo porque su entorno específico de aplicación
  2. Similar con Pid : Cada aplicación es un Process
  3. 3ª línea en onCreate igual que Pid porque es el UIThread y en Android OS como basado en Linux sabemos que el problema con respecto a Process es en realidad Thread etc … Y en Async el ThreadId es diferente porque AsyncTask ejecuta en Thread diferente en lugar de la UIThread

Lo que estoy luchando por entender es Thread.currentThread().getId() . Lo que espero es obtener id id como Thread.currentThread().getId() para el mismo entorno de ejecución. por ejemplo, para onCreate I quiere que las líneas 3,4 sean iguales (29776), y para Async espero que las líneas 3,4 sean las mismas (30426). ¿Que esta pasando aqui?

Gracias,

Pregunta muy interesante por el OP y decidí cavar (me encanta el código abierto).

La respuesta corta es: son diferentes porque son diferentes, porque nunca fueron hechos para ser iguales.

  • Process.myTid() es el ID de subproceso de linux
  • Thread.getId() es un simple número secuencial simple.

Pero la respuesta corta es aburrida, así que vamos a explorar de dónde viene la respuesta (enlaces en los puntos de respuesta a los códigos fuente pertinentes).

En Process.myTid() , verá que es simplemente llamadas de Os.gettid() que en sí mismo llama a un método nativo en Libcore para ese método está a continuación:

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

además los documentos para Os.gettid(); encontrará un enlace al Manual del Programador de Linux

gettid () devuelve el ID de subproceso de la persona que llama (TID). En un proceso de subproceso único, el ID de subproceso es igual al ID de proceso (PID, como devuelto por getpid (2)). En un proceso multiproceso, todos los subprocesos tienen el mismo PID, pero cada uno tiene un TID único.

  • Esto significa que Process.myTid() devuelve el ID de subproceso dado por el kernel de Linux.

Por otro lado Thread.getId() es simplemente devolver un long . Este largo se asigna durante init(...) como tid = nextThreadId(); . Entonces la última pieza de este rompecabezas, a continuación, es el código para nextThreadId()

 /* For generating thread ID */ private static long threadSeqNumber; private static synchronized long More ...nextThreadID() { return ++threadSeqNumber; } 
  • Eso significa que Thread.getId() es simplemente una "capa java" estática de largo que se auto-incremento para cada hilo.
  • El cierre de ProgressDialog enClick
  • ¿Puedo agregar más de un AsyncTask y ejecutar simultáneamente?
  • Cómo administrar el número de subprocesos dentro de la tarea de sincronización
  • Problemas con las devoluciones de llamada personalizadas de AsyncTaskLoader
  • Android loopj + GCMIntentService enviar mensaje a un Handler en un hilo muerto
  • Android AsyncTasks Cómo comprobar si la actividad aún se está ejecutando
  • ASync Task no se puede ejecutar dos veces
  • Devolución de datos de AsyncTask sin bloquear la interfaz de usuario
  • ¿Es mejor usar AsyncTask o Service para cargar un archivo en segundo plano?
  • Android ¿cuántos hilos puedo tener?
  • ¿Cuáles son las ventajas / desventajas de pasar argumentos al constructor AsyncTask?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.