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
-
Uid
es el mismo porque su entorno específico de aplicación - Similar con
Pid
: Cada aplicación es unProcess
- 3ª línea en
onCreate
igual quePid
porque es elUIThread
y en Android OS como basado en Linux sabemos que el problema con respecto aProcess
es en realidadThread
etc … Y enAsync
elThreadId
es diferente porqueAsyncTask
ejecuta enThread
diferente en lugar de laUIThread
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?
- La transacción de Sqlite bloquea Android ui
- ¿Debo llamar a super.onPostExecute (resultado) en Android AsyncTask?
- OnCreateView () espera que AsyncTask se ejecute?
- Android -El contenido del adaptador ha cambiado pero ListView no recibió una notificación
- Los hilos AsyncTask nunca mueren
Gracias,
- Evitar reiniciar fragmento asynctask en cambio de orientación de pantalla
- ¿Debo usar la clase AsyncTask dentro de la Actividad de Extensión de MainActivity?
- Excepción de Android asynctask
- ¿Cómo devuelvo un booleano de AsyncTask?
- ¿Cómo utilizar ExecutorService con Android AsyncTask?
- AsyncTask - ¿qué parámetros se necesitan para extender y doInBackground?
- ¿Cómo comparar la excepción captada contra excepciones estándar en la tarea asíncrona android?
- Carga de imagen asíncrona, compruebe si una imagen se recicla
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.