Supongamos que hay dos hilos que se ejecutan simultáneamente, y el código ejecutado por un hilo contiene un bucle muerto como: mientras (verdadero) ... Cuando el hilo ejecute el código en while (verdadero), ¿el otro hilo tendrá la oportunidad de ejecutar?
Código de muestra (el código se origina en Internet)
Servicio de clase pública {objeto objeto1 = nuevo objeto (); public void MethodA () {SynChronized (Object1) {System.out.println ("Methoda Begin"); booleano iscontinuerun = true; // Ejecutar un bucle muerto aquí mientras (isContinUerun) {} System.out.println ("Methoda End"); }} Objeto objeto2 = nuevo objeto (); public void Methodb () {SynChronized (Object2) {System.out.println ("Methodb Begin"); System.out.println ("Methodb End"); }}} La implementación de las dos clases de hilos es la siguiente:
importar servicio.service; public class Thread extiende Thread {Servicio de servicio privado; publicada public (servicio de servicio) {super (); this.service = servicio; } @Override public void run () {servicio.methoda (); }} Subh a ejecuta métoda (), y hay un bucle muerto en métoda ()
importar servicio.service; public class Threadb extiende Thread {Servicio de servicio privado; public Threadb (servicio de servicio) {super (); this.service = servicio; } @Override public void run () {servicio.methodb (); }}El hilo B ejecuta Methodb (). Cuando el hilo A entra en el bucle While Dead en MethodA (), ¿puede el subproceso B ejecutar y completar?
Clase de prueba
importar servicio.service; import Extthread.threada; import Extthread.threadb; public class run {public static void main (string [] args) {servicio de servicio = nuevo servicio (); Thinta athread = new Thinda (Servicio); Athread.Start (); Threadb bthread = new Threadb (servicio); bthread.start (); }}Dado que el bloqueo del objeto obtenido por el subproceso A y el hilo B no son el mismo bloqueo, se puede ver desde el resultado que el hilo B se puede ejecutar y completar. Desde que Thread A entra en el bucle While Dead, Thread A continúa ejecutándose y ejecutándose (todo el programa no ha terminado), pero el hilo B terminará.
Es decir, aunque el hilo A siempre se está ejecutando mientras, necesita tomar la CPU. Sin embargo, la programación de hilos es responsabilidad del JVM o del sistema operativo. No significa que el hilo A esté constantemente en bucle, y luego el hilo B no ocupará la CPU. Para el hilo A, es equivalente a un trabajo "intensivo en cálculo". Si nuestro bucle while prueba continuamente si una determinada condición es verdadera, entonces este método es un desperdicio de CPU. Puede referirse a un ejemplo específico: "Método de comunicación entre hilos" en el método de comunicación entre hilos de Java Multi-Thread-Thread Point del segundo punto del "Método de comunicación entre treflexidad" al sondear.
Si el servicio.java se modifica de la siguiente manera:
Servicio de clase pública {// objeto objeto1 = nuevo objeto (); public void MethodA () {SynChronized (this) {System.out.println ("Methoda Begin"); booleano iscontinuerun = true; // Ejecutar un bucle muerto aquí mientras (isContinUerun) {} System.out.println ("Methoda End"); }} // objeto objeto2 = nuevo objeto (); public void Methodb () {SynChronized (this) {System.out.println ("Methodb Begin"); System.out.println ("Methodb End"); }}}Si el hilo A obtiene primero el bloqueo del objeto, el hilo A está siempre en el bucle While debido al bucle While. El hilo B no puede ejecutar métodosb () porque no puede obtener el bloqueo.
Se puede ver que si un hilo no puede salir en el método sincronizado y no puede liberar el bloqueo, el otro hilo solo puede esperar infinitamente.
Lo anterior se trata de este artículo. Espero que sea útil para todos aprender Java multithreading.