Este artículo estudia principalmente ejemplos de código relacionado de la tecnología de comunicación de sincronización de hilos tradicionales de la concurrencia de Java, como sigue.
Veamos una pregunta primero:
Hay dos hilos. El hilo infantil se ejecuta 10 veces primero, luego el hilo principal se ejecuta 5 veces, luego cambia al hilo infantil ejecuta 10 y luego el hilo principal se ejecuta 5 veces ... Este viaje redondo es 50 veces.
Después de leer esta pregunta, es obvio que se usa la comunicación entre hilos. Permítanme analizar la idea primero: primero debe haber dos hilos, y luego debe haber 50 bucles en cada hilo, porque cada hilo tiene que realizar tareas 50 veces, la tarea del hilo principal es ejecutar 5 veces, y la tarea del hilo infantil es ejecutar 10 veces. La tecnología de comunicación entre hilos utiliza principalmente wait() y notify() . El método Wait () hace que el hilo actual espere y libere el bloqueo sostenido. notify() indica que se despierta un solo hilo que espera en este monitor de objeto. Completemos este problema de comunicación entre huellas paso a paso.
Primero, independientemente de la comunicación entre el hilo principal y el hilo infantil, escriba las tareas que se ejecutarán por cada hilo:
public class TraditionalThreadCommunication {public static void main(String[] args) {//Open a child thread new Thread(new Runnable() {@Override public void run() {for (int i = 1; i <= 50; i ++) {synchronized (TraditionalThreadCommunication.class) {//Sub thread task: execute 10 times for (int j = 1;j <= 10; j ++) {System.out.println ("Sub secuencia de hilo de" +j +", bucle de" +i);}}}}}). Start (); // El método principal es el hilo principal para (int i = 1; i <= 50; i ++) {sincronizado (tradicionalThreadComunication.class) {/ //inter {System.out.println ("Secuencia de hilo principal de" + j + ", bucle de" + i);}}}}}}}}}}}}}}}}}}}}Como se mencionó anteriormente, los dos hilos tienen 50 grandes bucles y ejecutan 50 tareas, la tarea del hilo infantil se ejecuta 10 veces y la tarea del hilo principal se ejecuta 5 veces. Para garantizar la sincronización entre dos hilos, se utilizan bloques de código de sincronización sincronizados, y se usa el mismo bloqueo: objeto bytecode de la clase. Esto garantiza la seguridad del hilo. Pero este diseño no es muy bueno. Al igual que escribí en el punto muerto en la sección anterior, podemos poner tareas de hilo en una clase. El patrón de este diseño está más estructurado, y poner diferentes tareas de hilos en la misma clase resolverá fácilmente el problema de sincronización porque es fácil usar el mismo bloqueo en una clase. Entonces modifique el programa anterior:
clase pública tradicionalThreadCommunication {public static void main (string [] args) {Business Business = New Business (); // nueva clase de procesamiento de tareas de hilo // Abrir un hilo infantil nuevo hilo (new runnable () {@Override public void run () {for (int i = 1; i <= 50; i ++) {bussings.sub (i);}}}}). Thread for (int i = 1; i <= 50; i ++) {Bussiness.main (i);}}} // Los datos comunes (incluidos los bloqueos de sincronización) o varios métodos comunes que se utilizarán deben clasificarse en la misma clase. Este diseño solo refleja la robustez del programa de agrupación de clase alta. clase Business {public sincronizado void sub (int i) {for (int j = 1; j <= 10; j ++) {system.out.println ("secuencia de subprofil de" + j + ", bucle de" + i);}} public sincronizado sincronizado main (int i) {para (int j = 1; j <= j ++) {system.out.println ("JUNTULE OF JUNTULE OF JUNTULE OF SEIXHE DE SEITULAR + ", bucle de" + i);}} Después de esta modificación, la estructura del programa se vuelve más clara y más robusta. Simplemente agregue la palabra clave sincronizada a los métodos de tarea de dos hilos y use este bloqueo. Pero todavía no hay comunicación entre los dos hilos. El resultado de la ejecución es que el hilo principal aumenta la tarea 50 veces, y el hilo infantil resume la tarea 50 veces. La razón es muy simple, porque hay sincronización sincronizada.
Lo siguiente continúa mejorando el programa para permitir la comunicación entre los dos hilos como se describe en la pregunta:
clase pública tradicionalThreadCommunication {public static void main (string [] args) {Business Business = New Business (); // nueva clase de procesamiento de tareas de hilo // Abrir un hilo infantil nuevo hilo (new runnable () {@Override public void run () {for (int i = 1; i <= 50; i ++) {bussings.sub (i);}}}}). Thread for (int i = 1; i <= 50; i ++) {Bussiness.main (i);}}} // para usar datos comunes (incluidos los bloqueos de sincronización) o varios métodos comunes deben clasificarse en la misma clase. Este diseño solo refleja la robustez del drama de Gao Lei y el programa. clase de clase {booleano privado bshouldsub = true; public sincronizado void sub (int i) {while (! bshouldsub) {// Si no es su turno para ejecutar, intente {this.wait (); // El objeto que llama el método Wait () debe ser el mismo que el objeto de bloqueo sincronizado. Aquí sincronizado está en el método, así que use esta} capt (interruptedException e) {// tODO Generated Auto Generated Blocke.PrintStackTrace ();}} for (int j = 1; j <= 10; j ++) {System.out.Println ("Subsenencia de subproces de" + J + ", bucle de" + I);} BShoulds. this.notify (); // despertar el hilo principal que espera} public sincronizado void main (int i) {while (bshouldsub) {// Si no es su turno para ejecutar, try {this.wait ();} catch (interruptedException e) {// tODO AUTO AUTO GENERADO BLOCKE.PRINTSTACKTRACE ();}}}}} {/1; ++) {System.out.println ("Secuencia de hilo principal de" + j + ", bucle de" + i);} bshouldsub = true; // Cambia la etiqueta this.notify (); // despertar el hilo infantil que espera}}En primer lugar, no hablemos sobre la implementación específica del programa, desde una perspectiva estructural, ya nos hemos dado cuenta de que los beneficios de este diseño: no hay necesidad de modificar nada en la función principal, y la lógica sobre la sincronización entre hilos y la comunicación entre thebe está todo en la clase empresarial. Diferentes hilos en la función principal solo necesitan llamar a las tareas correspondientes colocadas en la clase. Refleja los beneficios del flujo alto.
Veamos nuevamente el código específico. Primero, defina una variable booleana para identificar qué hilo debe ejecutarse. Cuando no es el hilo del niño, dormirá. Luego ejecutará naturalmente el hilo principal. Después de la ejecución, modificará el bshouldsub y despertará el hilo del niño. En este momento, el hilo infantil juzgará que, si bien no está satisfecho y no duerme. Ejecutará la tarea de hilo infantil. Del mismo modo, después de que el hilo principal acaba de modificar el bshouldsub, cuando el segundo bucle se usa para ejecutar la tarea del hilo principal, dormirá y esperará a que el hilo del niño se despierte. Esto deja la lógica muy clara. El hilo principal y el hilo infantil se turnan para ejecutar sus respectivas tareas, y este ritmo es de 50 veces en total.
Hay otra pequeña explicación: en realidad es posible usar si juzgar, pero ¿por qué usar un tiempo? Porque a veces los hilos se despiertan falsamente (es como un sonambulismo, que obviamente está durmiendo pero de pie). Si usa si, después de que se despierta falsamente, no volverá a juzgar si, y luego ejecutará naturalmente la tarea. De acuerdo, se está ejecutando otro hilo y afectará otro hilo en un flash. Pero si es un tiempo, será diferente. Incluso si el hilo está falsamente despierto, aún juzgará un tiempo. Sin embargo, el otro hilo se está ejecutando en este momento. Bshouldsub no se ha modificado, por lo que todavía entra mientras duerme nuevamente ~ ¡por lo que es muy seguro y no afectará el otro hilo! Esto también se hace en el documento JDK oficial.
Resumamos la comunicación entre hilos.
Lo anterior es toda la explicación detallada del código de tecnología de comunicación de sincronización de hilos tradicional de la concurrencia de Java, y espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!