En la concurrencia de Java, ¿qué hace que un hilo "active"? ¿Solo el hecho de que no está al ralentí? ¿Un hilo "en espera" o "suspendido" todavía se considera, técnicamente, activo?¿Qué define un hilo "activo"?
Respuesta
Por lo que puedo decir, el término 'activo' parece ser usado mucho pero no definido. El método ThreadGroup.enumerate()
se documenta a:
copias en la matriz especificada cada hilo activo en este grupo de hilos y sus subgrupos.
y de looking at the source for this, se está comprobando el método Thread.isAlive()
y la adición de aquellos a la enumerable. De esto deduzco que los términos 'activo' y 'vivo' son intercambiables y 'vivo' se define como:
Un hilo está activo si se ha iniciado y aún no ha muerto.
En este contexto, tomo "activo" para indicar que están ejecutando el código. Los hilos inactivos, aquellos que están bloqueados en llamadas de E/S o en espera de bloqueos, consumen solo recursos de memoria sin afectar la CPU (o solo marginalmente).
Sin embargo, realmente depende de lo que estén haciendo sus hilos. Si cada subproceso se itera sobre números para calcular números primos, están totalmente vinculados a la CPU, y realmente solo debería tener uno por núcleo para maximizar el rendimiento. Si realizan solicitudes HTTP o realizan E/S de archivos, puede permitirse tener bastantes por núcleo.
Al final, una declaración general que cubra todos los hilos en general sin tener en cuenta lo que están haciendo es bastante inútil.
Recomiendo encarecidamente el libro Java Concurrency in Practice para un tratamiento de alta calidad del tema de la programación simultánea de Java.
Aquí se usa la palabra "activo" en inglés normal.
Un significado normal en inglés de la palabra active es "hacer algo". Entonces, un significado intuitivo de "activo" para los hilos es que realmente se están ejecutando o están listos para ejecutarse.
En el contexto de esta cita:
"En general, es aceptable tener 4 - 20 hilos activos por núcleo"
la palabra "activo" se utiliza constantemente con este , aunque discutiría con los números. (20 es bastante alto, IMO).
Sin embargo, yo diría que esta es una declaración intencionalmente vaga. Los obsequios son el uso de la frase comadreja "es generalmente aceptado" (en lugar de citar fuentes específicas) y el amplio rango ("4 - 20"). Por lo tanto, podría argumentar que la palabra "activo" es otro ejemplo de vaguedad intencional.
IMO, el autor de la cita intenta hacer el comentario general de que "demasiados hilos son malos" ... sin ser preciso acerca de lo que es "demasiados". Extraer una guía más precisa atando lo que quiere decir con "activo" no tiene sentido.(Y para ser claro, no es posible decir cuántos "demasiados" es ... en general.)
Tome un vistazo a java.lang.Thread.State
En otros no Sistemas Java, activo equivale a "RUNNABLE". Una Tarea/Proceso/Subproceso está activo si es capaz de ejecutar código activamente. Se suspende si no lo está (bloqueo, etc.)
Como dijo Stephen C, active se usa más como inglés que como Java aquí.
"En general, es aceptable tener entre 4 y 20 hilos activos por núcleo". - Adam Tannon
En este sentido, creo que la palabra significa "listo para funcionar" en lugar de "vivo" o cualquiera de los otros posibles significados. Tiene sentido no tener más que un puñado de subprocesos en la lista de espera, porque no está obteniendo ningún valor para los subprocesos en espera, y usted contribuye a la programación y a la sobrecarga del cambio de contexto. Por otro lado, si tiene menos hilos listos para ejecutar que núcleos, no está haciendo uso del recurso disponible.
http://stackoverflow.com/questions/3275210/what-is-the-thread-state-of-a-thread-after-thread-yield – andersoj
- 1. Número de hilo activo en el grupo de hilos
- 2. ¿Qué es un hilo Kernel?
- 3. ¿Qué define esta macro?
- 4. ¿Qué significa ## en a #define?
- 5. ¿Qué significa "unirse" a un hilo?
- 6. ¿Qué significa ser un hilo daemon?
- 7. ¿Por qué querría comenzar un hilo "suspendido"?
- 8. Cuadrado de un número que se define usando #define
- 9. es pex realmente activo?
- 10. ¿BeginInvoke() ejecuta un hilo separado?
- 11. ¿Por qué se define este búfer dentro de un bucle?
- 12. ¿Por qué #define no requiere un punto y coma?
- 13. ¿Qué propiedad define el margen de un párrafo o tabla?
- 14. ¿Qué es un hilo de trabajo y su diferencia de un hilo que creo?
- 15. ¿Por qué Iterator define la operación remove()?
- 16. ¿Qué define los grados de cifrado?
- 17. ¿Por qué SDL define la macro principal?
- 18. ¿Qué sucede si un hilo se cuelga en un proceso?
- 19. ¿Qué hilo obtendrá el bloqueo?
- 20. C#: ¿En qué ensamblado se define SHDocVw.WebBrowser_V1?
- 21. ¿Para qué propiedad interna se define ECMAScript?
- 22. ¿Qué hace "#define STR (a) #a"?
- 23. ¿Por qué no se define Element.prototype?
- 24. ¿Por qué se define MemberwiseClone en System.Object?
- 25. ¿Qué es "hilo en línea"?
- 26. ¿Cómo se define threadsafe?
- 27. ¿Hay un #define para C99?
- 28. ¿Cómo activo la depuración inversa en un programa multiproceso?
- 29. CallContext.SetData() - ¿está el objeto disponible cuando el hilo se activa-inactivo-activo (TPL)?
- 30. En Java, si un hilo se mata, ¿qué pasará con el otro hilo?
¿Cuál es el contexto donde aparece "activo"? Es un término demasiado general para proporcionar una definición difícil con tan poca información. –
"En general, es aceptable tener de 4 a 20 hilos activos por núcleo". – IAmYourFaja
Un hilo 'java' activo es un hilo * elegible * para ser el hilo de ejecución actualmente en ejecución. Es un hilo que ha dejado el estado "nuevo" y ha alcanzado (o vuelto a alcanzar) el estado "ejecutable". Los hilos activos asumen la residencia en el grupo de subprocesos ejecutables. Es un error común que el término sensible al contexto * activo * se tome como "el hilo ejecutable que se está ejecutando actualmente". – 8bitjunkie