Las publicaciones de blog anteriores básicamente resumieron cierto contenido en la concurrencia de Java. Esta publicación de blog comienza principalmente con un problema y vea qué tecnologías de concurrencia resumidas anteriormente se pueden usar para resolverlas.
Simular un escenario: procesar 16 registros de registro, cada tiempo de impresión de registro de registro toma 1 segundo. En circunstancias normales, si estos 16 registros están terminados, lleva 16 segundos. Para mejorar la eficiencia, estamos listos para iniciar 4 hilos para imprimir e imprimirlos en 4 segundos para realizar esta demostración.
Analicemos esta pregunta primero. Con respecto a estos 16 registros de registro, podemos generarlos en el hilo principal. Esto no es difícil. La clave es iniciar 4 hilos para ejecutar. Hay dos ideas ahora: una es que la generación de registros y el hilo que imprime los registros están separados lógicamente; El otro es que la generación de registros y el hilo que imprime los registros lógicamente no están separados. Esto puede ser un poco oscuro. Permítanme escribir una demostración implementada basada en estas dos ideas.
La generación de registros y la impresión de registro están lógicamente separadas.
Esto es equivalente a dos frentes: un frente está generando registros constantemente, y el otro frente está constantemente imprimiendo registros. Es obvio que pensará en el uso de colas de bloqueo y generará registros que siguen conectando las colas de bloqueo e imprimir registros que siguen obteniendo de las colas de bloqueo. El tamaño de la cola de bloqueo puede ser establecido por usted mismo, 16 o 1, lo que no afecta la ejecución. Así que se utilizará Bloquingqueue, echemos un vistazo a la demostración implementada a continuación:
public class Practice1 {public static void main(String[] args) {//Define a blocking queue, the queue size can contain 16 information BlockingQueue<String> queue = new ArrayBlockingQueue<String>(16);for (int i = 0; i < 4; i ++) {//Open four threads to block the queue to get the log print new Thread(new Runnable() {@Override public void run () {while (true) {try {string log = queue.take (); // get log parselog (log); // imprima log} capt (interruptedException e) {// toDO Auto Generated BLOCKE.PrintStackTRace ();}}}}}). Start ();} System.out.PRINTLN ("BEGIN:" BEGIN: "" (System.CurrentTimEmillis ()/1000)); for (int i = 0; i <16; i ++) {String final log = "" +(i +1); // indica un try log {queue.put (log); // subt el log generado en la cola de bloqueo} captura (interrupción de interrogada e) {// ado-generated captura de captura autogenerada blocke.printStackTrace ();}}} public static void parselog (string log) {// método para imprimir log system.out.println (thread.currentThread (). getName () + "---" + Segundo} Catch (InterruptedException e) {// TODO Auto Generado Blocke.PrintStackTrace ();}}}} Esto es como si un sistema esté funcionando, generando registros constantemente y abriendo continuamente múltiples subprocesos para imprimir información de registro. La demostración está escrita y el resultado de la operación no se publica.
La generación de registros y la impresión de registro no están lógicamente separadas.
¡Esta idea es que cuando genere el registro, lo imprime para mí y lo hagas con cuatro hilos juntos! Entonces, si crees de esta manera, tienes que usar el grupo de hilos. Primero creé un grupo de subprocesos, que contenía 4 hilos, y luego, cuando se generó el registro, le pedí al grupo de subprocesos que usara el hilo para ejecutarlo. La demostración es la siguiente:
Public Class Practice1 {public static void main (string [] args) {ExecutorService Service = Executors.NewFixedThreadPool (4); // Cree un HIREB Pool System.out.println ("begin:" +(System.CurrentTentTimEmillis ()/1000)); para (int i = 0; i <16; i ++) {Final String log Service.ExeCute (new runnable () {// tome un hilo para ejecutar @Override public void run () {parselog (log);}}});} servicio.shutdown (); // No olvide apagar el grupo de subprocesos al final} public static void parselog (string log) {system.println (Thread.currentthread (). "---" + (System.CurrentTimemillis ()/1000)); intente {hilt.sleep (1000); // simular impresión un registro toma 1 segundo} captura (interruptedException e) {// todo género automático blocke.printstacktRace ();}}}}Resumamos este problema aquí. Si comprende estas dos ideas, generalmente puede resolverlas de manera efectiva.
Lo anterior es todo el contenido de este artículo sobre la programación de Java, un código de ejemplo de problema de múltiples subprocesos, 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!