¿Qué hace que el orden de ejecución de los hilos sea impredecible? ¿El planificador en algún momento usa números aleatorios o revisa los recursos del sistema o ve qué hilo ha esperado lo suficiente o ...?¿Qué hace que el orden de ejecución de los hilos sea impredecible?
Respuesta
El programador es, por lo general, el programador del sistema operativo. Se ve influenciado por muchos factores, incluyendo lo que están haciendo otros procesos en la máquina, qué está haciendo el hardware (interrupciones), etc. Dependiendo del sistema operativo, supongo que a veces puede haber números aleatorios, pero sospecho que generalmente no. Es más justo la forma impredecible en que los múltiples intervalos de tiempo variables pueden superponerse.
Dependiendo de la JVM, JVM podría transferir el hilo al SO y el programador del sistema operativo programará el hilo, o JVM puede decidir programar el hilo, por lo que la primera diferencia (comportamiento impredecible en 2 máquinas diferentes para misma situación) viene aquí, si el hilo está siendo programado por JVM u OS, no se puede estar realmente seguro ..... Además hay varios factores, la prioridad del hilo es un factor (podemos establecer la prioridad), el recurso es otro factor ... Es menos probable que haya números aleatorios involucrados.
El uso de números aleatorios en el programador introduciría sobrecarga innecesaria en una sección crítica del sistema operativo, por lo que es muy poco probable que sea la causa, al menos en cualquier sistema operativo convencional.
Un hilo generalmente se ejecuta hasta que realiza una llamada al sistema operativo que bloquearía, o hasta que ocurra una interrupción, o hasta que su intervalo de tiempo caduque (que en última instancia es solo una interrupción del temporizador). Incluso si pudieras construir cosas cuidadosamente para que dos hilos siempre se bloquearan en un orden determinista, no tienes control sobre exactamente cuándo ocurrirán los dos últimos efectos. El orden en que se ejecutan los hilos en su aplicación eventualmente será influenciado por eventos fuera de su aplicación.
Los sistemas operativos modernos usan lo que se conoce como Preemtive multitasking. Garantiza a cada proceso en el sistema un segmento de tiempo de CPU, con varias reglas para cuándo interrumpir cada uno y dejar que el siguiente tenga un turno. Es por eso que no necesita una CPU por proceso en su máquina :)
No es aleatorio, pero en general es impredecible.
Otras preguntas hacen buenos puntos con detalles técnicos, pero:
Para ser más precisos, la programación de subprocesos en Java es bastante eficiente controlado por cerraduras, espera/notificar a/notifyAll, sueño métodos y otra controles de concurrencia Solo en esos momentos durante la ejecución de la aplicación, cuando estos no están presentes, el orden de ejecución de diferentes subprocesos queda sin definir.
La razón principal es, probablemente, por la facilidad de la portabilidad de Java en diferentes sistemas de hardware/sistema operativo. También es lógico que si usted como desarrollador no define el orden en el que se deben ejecutar diferentes subprocesos en su aplicación utilizando los controles de concurrencia mencionados anteriormente, no le importa y simplemente no importa, y de manera arbitraria puede ser elegido por la JVM.
- 1. ¿Cómo la recursión hace que el uso de la memoria en tiempo de ejecución sea impredecible?
- 2. boost :: hilos orden de ejecución
- 3. ¿Qué hace que el encuadernado sea lento?
- 4. ¿Qué hace que STL sea rápido?
- 5. ¿Qué hace que Ometa sea especial?
- 6. ¿Qué hace que Oracle sea más escalable?
- 7. ¿Qué hace que el dominio cruzado ajax sea inseguro?
- 8. ¿Qué hace que una declaración SQL sea sargable?
- 9. ¿Qué hace que Git sea mejor que Subversion para fusionarse?
- 10. ¿Qué hace que PostgreSQL sea más avanzado que MySQL?
- 11. ¿Qué hace que ágil sea mejor que shiro?
- 12. Establecer el orden de iteración varía de ejecución a ejecución
- 13. ¿Por qué construir con paquetes de tiempo de ejecución hace que el archivo EXE sea más pequeño?
- 14. ¿Qué hace que Ruby sea un lenguaje elegante?
- 15. ¿Qué hace que un lenguaje sea orientado a objetos?
- 16. ¿Qué hace que ApplePC memcpy sea tan rápido?
- 17. ¿Qué hace que una aplicación web sea una aplicación amigable?
- 18. ¿Qué hace que el sistema de tipos de Haskell sea más "potente" que los sistemas de otros idiomas?
- 19. ¿Qué hace que MVVM sea especialmente adecuado para WPF?
- 20. ¿Qué hace que VxWorks sea tan determinista y rápido?
- 21. ¿Qué hace que una entrada sea vulnerable a XSS?
- 22. ¿Por qué desechar StreamReader hace que una secuencia sea ilegible?
- 23. ¿Qué hace que la bandera UnhandledExceptionEventArgs.IsTerminating sea verdadera o falsa?
- 24. ¿Qué hace que este código sea "endian independiente"?
- 25. ¿Qué hace que un portlet JSR-286 sea compatible?
- 26. ¿Qué hace que una gran especificación funcional sea genial?
- 27. ¿Qué hace que este "declarador no sea válido"? C++
- 28. ¿Qué determina el orden de ejecución de los métodos en las cadenas jQuery?
- 29. ¿El orden de ejecución de los parámetros garantiza en Java?
- 30. hilos pitón de larga ejecución
Todas las JVM principales actuales dejan la programación por completo en el sistema operativo. Algunas JVM antiguas usaban hilos verdes, pero en ese caso * la JVM administraba la programación de todos los hilos *. –
@MichaelBorgwardt Supongo que el libro de SCJP para Java 6 necesita incluir esta explicación, ¡ellos no mencionarán la diferencia sobre las JVM antiguas y nuevas en el libro! de todos modos gracias por la actualización – Zohaib