cada hilo se dará un nativo hebra del sistema operativo a RUN que se puede ejecutar en una CPU diferente pero desde Java es interpreta estos hilos requerirán para interactuar con la JVM de nuevo y de nuevo para convertir el byte código a instrucciones de la máquina? ¿Estoy en lo cierto?
Estás mezclando dos cosas diferentes; JIT realizado por la VM y el soporte de subprocesamiento ofrecido por la VM. En el fondo, todo lo que haces se traduce a algún tipo de código nativo. Una instrucción de código de bytes que utiliza el hilo no es diferente de un código JIT que accede a los hilos.
En caso afirmativo, que para programas pequeños Java ¿Los hilos no son una gran ventaja?
Define small aquí. Para procesos de corta vida, sí, el enhebrar no hace una gran diferencia ya que su ejecución secuencial es lo suficientemente rápida. Tenga en cuenta que esto nuevamente depende del problema que se está resolviendo. Para los kits de herramientas de interfaz de usuario, no importa qué tan pequeña sea la aplicación, se requiere algún tipo de ejecución de subprocesamiento/asincrónica para mantener la UI receptiva.
Enhebrar también tiene sentido cuando tiene cosas que pueden se pueden ejecutar en paralelo. Un ejemplo típico sería hacer IO pesado en el hilo y cómputo en otro. Realmente no querrás bloquear tu procesamiento solo porque tu hilo principal está bloqueado haciendo IO.
Una vez que el hotspot compila estas dos rutas de ejecución ambos pueden ser tan buenos como subprocesos nativos? ¿Estoy en lo cierto?
Ver mi primer punto.
Enlazar realmente no es una bala de plata, especialmente cuando se trata del concepto erróneo común de "usar hilos para hacer que este código sea más rápido". Un poco de lectura y experiencia será tu mejor apuesta. ¿Puedo recomendar una copia de this awesome book? :-)
@Sanjay: Infact ahora puedo replantear mi pregunta . Si tengo un hilo cuyo código no ha sido JIT, ¿cómo lo ejecuta el subproceso OS ?
Nuevamente lo digo, enhebrar es un concepto completamente diferente de JIT. Vamos a tratar de mirar a la ejecución de un programa en términos simples:
pkg.MyClass Java -> VM localiza método a ejecutar -> Iniciar la ejecución de la código de bytes para la línea por línea método -> convertir cada instrucción de código byte a su contraparte nativa -> instrucciones ejecutado por OS -> instrucción ejecutada por la máquina
Cuando JIT ha pateado en:
java pkg.MiClase -> VM localiza método que se ejecute que ha sido JIT'ed -> localizar el código asociado nativa para ese método -> instrucciones ejecutado por OS -> instrucción ejecutada por la máquina
Como puede ver, independientemente de la ruta que siga, la instrucción VM debe asignarse a su contraparte nativa en algún momento. Si ese código nativo se almacena para su reutilización o si se desecha si es diferente (optimización, ¿recuerdas?).
ahí para responder a su pregunta, cada vez que se escribe enhebrar código, es traducido a código nativo y ejecutar por el sistema operativo. Si la traducción se hace sobre la marcha o se busca en ese punto en el tiempo es un problema completamente diferente.
Lo siento por la diatriba, esta respuesta fue mucho más larga de lo esperado. ;-) –
@Sanjay: Si lo hago bien, JIT se realizará incluso antes de que el subproceso se ejecute por primera vez.Esencialmente, la JVM primero hace el JIT para ambos hilos independientes y luego los envía a los hilos del sistema operativo para su ejecución. – Geek
@ Geek: como ya se mencionó, JIT y la ejecución de subprocesos son dos cuestiones ortogonales. Sí, es muy posible que la pieza de código que un subproceso está a punto de ejecutarse ya haya sido JIT por la máquina virtual. Además, no hay * reenvío * de ejecución. Cuando se invoca un método 'start()' en un objeto Thread, se crea un nuevo hilo nativo del sistema operativo, no hay reenvío entre "hilo Java" y "hilo OS". Además, JIT no es obligatorio. Puede suceder que su hilo esté ejecutando código que no ha sido JIT. JIT es una optimización específica del rendimiento. –