El problema de la sincronización de subprocesos múltiples, la lógica de programación es como se muestra en la figura. El primer paso es generar los datos básicos correspondientes y el segundo paso es operar en función de los datos básicos del paso uno.
paquete?com.cao.test;
importar?java.util.HashMap;
importar?java.util.Map;
público?clase?Test5?{
público?static?void?main(String?args[])?{
Test5?s?=?new?Test5() ;
s.initStep();
}
Mapa
public?Test5( )?{
this.map?=?new?HashMap
this.map.put("STEP_NO",?0?+? "");//?Esta variable debe considerar la seguridad de los subprocesos al asignar
this.map.put("STEP_NAME",?"A");
this.map. put("THREAD_DATA",?1?+?"");
}
/**
?*?Dar los hilos de los dos pasos Numeración, esto es lo más importante.
?*?
?*?@return
?*/
public?int?getStepNo(String?stepName)? {
int?no?=?0;
mientras?(verdadero)?{
this.forSleep();
¿sincronizado?(Test5.class)?{
String?name?=?this.map.get("STEP_NAME");
if?(name.equals(stepName)) ?{
if?("A".equals(stepName))?{
this.map.put("STEP_NAME",?"B");
}?else?{
this.map.put("STEP_NAME",?"A");
}
//Aquí Debe estar bloqueado al realizar la asignación, problema de intercambio de subprocesos
String?s?=?this.map.get("STEP_NO");
no?=? );
no?=?no?+?1;
this.map.put("STEP_NO",?no?+?""); p> descanso;
}
}
}
retorno?no;
}
public?void?forSleep()?{
¿intentar?{
Thread.sleep(1000);
} ?catch?(Excepción ?e)?{
e.printStackTrace();
}
}
public?void?
int?no?=?this.getStepNo("A");
System.out.println("-----Un paso-- ----Subproceso : "?+?no?+?", número asignado correctamente----------");
while?(true)?{
esto. forSleep();
String?data?=?this.map.get("THREAD_DATA");
int?num?=?Integer.parseInt (datos); p>
if?(num?==?no)?{
this.map.put("THREAD_DATA",?(num?+?1)?+ ?"");
descanso;
}
}
System.out.println("------ Paso A---- -Thread: "?+?no?+?", la ejecución finaliza-----------");
}
public?void?stepBRunning( )?{
int?no?=?this.getStepNo("B");
System.out.println("----- Paso B---- --Hilo: "?+?no?+?", número
Asignación exitosa----------");
while?(true)?{
this.forSleep();
Cadena ?data?=?this.map.get("THREAD_DATA");
int?num?=?Integer.parseInt(data);
if?(num?= = ?no)?{
this.map.put("THREAD_DATA",?(num?+?1)?+?"");
break;
}
}
System.out.println("------Paso B-----Subproceso:"?+?no?+? " , la ejecución finaliza----------");
}
public?void?runStepA()?{
for ?( int?i?=?0;?i?10;?i++)?{
Hilo?t1?=?new?Thread(new?Runnable()?{
public?void?run()?{
¿intentar?{
stepARunning();
}?catch?(¿Excepción?e)? /p>
}
}
});
t1.start();
} p>
}
public?void?runStepB()?{
para?(int?i?=?0;?i?10;?i++) ?{
¿Subproceso?t1?=?new?Thread(new?Runnable()?{
público?void?run()?{
¿probar?{
stepBRunning();
}?catch?(¿Excepción?e)?{
}
}
});
t1.start();
}
}
/**
?*?Dos pasos para inicializar
?*/
public?void?initStep()?{
Thread?t1?=?new ?Thread (¿nuevo?Runnable()?{
público?void?run()?{
¿probar?{
runStepA();
}?catch?(¿Excepción?e)?{
}
}
});
inicio( );
Thread?t2?=?new?Thread(new?Runnable()?{
public?void?run()?{
probar ?{
runStepB();
}?catch?(¿Excepción?e)?{
}
}
});
t2.start();
}
}
Ejecutar resultados
>
-----Paso A------Hilo: 1, número asignado correctamente----------
-----Paso B- - ----Hilo: 2, número asignado exitosamente-----------
-----Paso A------Hilo: 3, número asignado exitosamente - ----------
-----Paso B------Hilo: 4, número asignado correctamente----------
-----Paso A------Hilo: 7, número asignado correctamente----------
-----Paso B-- ----Hilo: 6, número asignado exitosamente----------
-----Paso A------Hilo: 5, número Asignación exitosa-- --------
-----Paso B------Hilo: 8, asignación de número exitosa---------- -
-----Paso A------Hilo: 9, número asignado correctamente----------
---- --Un paso-- ---Hilo: 1, fin de ejecución-----------
------Paso B-----Hilo: 2, Fin de ejecución--- -------
------Paso A-----Hilo: 3, fin de ejecución----------
-----Paso B------Hilo: 10, número asignado correctamente----------
----- Paso A----- -Hilo: 11, número asignado exitosamente----------
-----Paso B------Hilo: 12, Número asignado exitosamente----- -----
------Paso B-----Hilo: 4, ejecución completa---------- -
- ----Paso A------Subproceso: 13, número asignado correctamente-----------
---- --Paso A----- Hilo: 5, fin de ejecución-----------
-----Paso B------Hilo: 14, Número asignado correctamente------ ----
-----Paso A------Hilo: 15, número asignado correctamente--------- --
- -----Paso B-----Hilo: 6, fin de ejecución-----------
---- -Paso B------Hilo : 16, número asignado exitosamente-----------
-----Paso A------Hilo: 17, el número se asignó exitosamente---- ------
------Paso A-----Hilo: 7, finaliza la ejecución--------- --
------Paso B-----Hilo: 8, fin de ejecución-----------
---- --Paso A----- Hilo: 9, fin de ejecución-----------
-----Paso B------Hilo: 18, Número asignado correctamente------ ----
------Paso B-----Hilo: 10, ejecución completa-- -
-- ---Paso A------Hilo: 19, número asignado exitosamente----------
---- -Paso B------Hilo: 20, número asignado correctamente-----------
------Paso A-----Hilo: 11, la ejecución finaliza -------- ---
------Paso B-----Hilo: 12, finaliza la ejecución---------- -
--- ---Paso A-----Hilo: 13, fin de ejecución-----------
----- -Paso B-----Hilo: 14, ejecución completada -----------
------Paso A-----Hilo: 15, Fin de ejecución--------- -
----
--Paso B-----Hilo: 16, fin de ejecución-----------
------Paso A-----Hilo: 17, Fin de ejecución----------
------Paso B-----Hilo: 18, fin de ejecución----------
------Paso A-----Hilo: 19, fin de ejecución-----------
----- - Paso B-----Hilo: 20, fin de ejecución-----------
Análisis:
Bajo la premisa de garantizar la seguridad del hilo, dar A cada hilo del paso AB se le asigna un número. Luego espere en un bucle infinito los pasos realizados por los respectivos hilos. Se puede ver en los resultados de la ejecución que el número de asignación y la secuencia de ejecución son paralelos, y el resultado de la ejecución es la ejecución cruzada de los pasos AB. Esto debería satisfacer sus necesidades.
Este es el código java