Prefacio
Los artículos anteriores se centran en la optimización de la base de datos de servicios de back-end y el procesamiento paralelo de múltiples subprocesos, y ejemplos de lógica de pseudocodos antes y después de la transformación. Por supuesto, la optimización es infinita. Las generaciones anteriores plantan árboles y generaciones posteriores disfrutan de la sombra. A medida que los desarrolladores, ya que estamos en los hombros de los gigantes, debemos escribir programas más optimizados.
Caso de desarrollo de SpringBoot JDBCTEMPLATE Operación por lotes
Caso de desarrollo de SpringBoot: procesamiento paralelo de la multitarea multitarea de cuenta CountdownLatch
Renovación
Teóricamente, cuantos más hilos, más rápido puede ser el programa, pero en uso real, debemos considerar el consumo de recursos del hilo en sí misma creación y destrucción, así como el propósito de proteger el sistema operativo en sí. Por lo general, necesitamos limitar los hilos a un rango determinado, y los grupos de hilos juegan este papel.
Lógica del programa
Multitarea paralela + procesamiento del grupo de hilos.png
Los problemas que se pueden resolver con una imagen deben ser lo menos posible. Por supuesto, el principio subyacente aún debe ser recordado y entendido por todos.
Piscina de hilo de Java
Java proporciona cuatro tipos de grupos de hilos a través de ejecutores, a saber:
ventaja
Implementación del código
Método 1 (CountdownLatch)
/*** Multitarea paralela + estadísticas de grupo de hilos* Tiempo de creación 17 de abril de 2018*/public class StatsDemo {final static simpledateFormat sdf = new SimpleDateFormat ("yyyy-mm-dd hh: mm: ss"); Final static string starttime = sdf.format (nueva fecha ()); / ** * Tareas Io-intensivas = generalmente 2 * Número de núcleos de CPU (a menudo en hilos: interacción de datos de la base de datos, carga y descarga de archivos, transmisión de datos de red, etc.) * tareas intensivas de CPU = generalmente 1 núcleos de CPU + 1 (a menudo en hilos: algorits complejos) * tareas hypbrides = dependiendo de la configuración de la máquina y la complejidad de la complejidad */ static static static statics intempentángulos de intemperie =. Runtime.getRuntime (). Disponibleprocessors (); /*** public threadpoolexeCutor (int corePoolSize, int maximumumumeLize, largo keepAliveTime,* Unidad de tiempo de tiempo, Bloquingqueue <runnable> workqueue)* corepoolSize se utiliza para especificar el número de hilos núcleo* maximumsize especifica el número máximo de los subprocesos* Keepalivetime y el tiempo de tiempo máximo después de que el tiempo de supervivencia es un hastio de los hilos de hilo de hiesa de los hilos de los hilos de los hilos de los hilos de los hilos* La cola de la piscina de hilo y los hilos que aún no se han ejecutado esperarán en la cola* Monitor de la longitud de la cola para garantizar que la cola limita el tamaño de la piscina de hilo inadecuado puede reducir la velocidad de procesamiento, reducir la estabilidad y conducir a la fuga de memoria. Si hay muy pocos hilos configurados, la cola continuará creciendo y consumir demasiada memoria. * Y demasiados hilos ralentizarán la velocidad de todo el sistema debido al cambio de contexto frecuente, y se logrará el mismo resultado final. La longitud de la cola es crucial, debe estar limitada para que si el grupo de hilos está abrumado, puede rechazar temporalmente nuevas solicitudes. * La implementación predeterminada de EjecutorService es un Linked Blokingqueue ilimitado. */ private static threadpoolexecutor ejecutor = new ThreadPoolExeCutor (corepoolSize, corepoolSize+1, 10l, TimeUnit.seconds, new LinkedBlockingqueue <Runnable> (1000)); public static void main (string [] args) lanza interruptedException {CountdownLatch latch = new CountdownLatch (5); // use el método Ejecutar ejecutor.execute (nuevas estadísticas ("Tarea A", 1000, Latch)); Ejecutor.execute (nuevas estadísticas ("Tarea B", 1000, Latch)); Ejecutor.execute (nuevas estadísticas ("Tarea C", 1000, Latch)); Ejecutor.execute (nuevas estadísticas ("Tarea D", 1000, Latch)); Ejecutor.execute (nuevas estadísticas ("Tarea E", 1000, Latch)); Latch.Await (); // Espere la tarea de todos para finalizar System.out.println ("Todas las tareas estadísticas se completan:" + sdf.format (nueva fecha ()))); } estadísticas de clase estática implementos runnable {string statsname; int tiempo de ejecución; CountdownLatch Latch; Public Stats (String statsName, int runtime, CountdownLatch Latch) {this.statsname = statsname; this.runtime = Runtime; this.latch = Latch; } public void run () {try {system.out.println (statsname+ "do stats comienzan en"+ starttime); // simular la ejecución de la tarea TIEMH.Sleep (Runtime); System.out.println (statsname + "do estadísticas completadas en" + sdf.format (new date ())); Latch.CountDown (); // Una sola tarea termina, el contador se reduce por una} captura (interruptedException e) {E.PrintStackTrace (); }}}}Método 2 (futuro)
/*** Multitarea paralela + estadísticas de grupo de hilos* Tiempo de creación 17 de abril de 2018*/public class StatsDemo {final static simpledateFormat sdf = new SimpleDateFormat ("yyyy-mm-dd hh: mm: ss"); Final static string starttime = sdf.format (nueva fecha ()); / ** * Tareas Io-intensivas = generalmente 2 * Número de núcleos de CPU (a menudo en hilos: interacción de datos de la base de datos, carga y descarga de archivos, transmisión de datos de red, etc.) * tareas intensivas de CPU = generalmente 1 núcleos de CPU + 1 (a menudo en hilos: algorits complejos) * tareas hypbrides = dependiendo de la configuración de la máquina y la complejidad de la complejidad */ static static static statics intempentángulos de intemperie =. Runtime.getRuntime (). Disponibleprocessors (); /*** public threadpoolexeCutor (int corePoolSize, int maximumumumeLize, largo keepAliveTime,* Unidad de tiempo de tiempo, Bloquingqueue <runnable> workqueue)* corepoolSize se utiliza para especificar el número de hilos núcleo* maximumsize especifica el número máximo de los subprocesos* Keepalivetime y el tiempo de tiempo máximo después de que el tiempo de supervivencia es un hastio de los hilos de hilo de hiesa de los hilos de los hilos de los hilos de los hilos de los hilos* La cola de la piscina de hilo y los hilos que aún no se han ejecutado esperarán en la cola* Monitor de la longitud de la cola para garantizar que la cola limita el tamaño de la piscina de hilo inadecuado puede reducir la velocidad de procesamiento, reducir la estabilidad y conducir a la fuga de memoria. Si hay muy pocos hilos configurados, la cola continuará creciendo y consumir demasiada memoria. * Y demasiados hilos ralentizarán la velocidad de todo el sistema debido al cambio de contexto frecuente, y se logrará el mismo resultado final. La longitud de la cola es crucial, debe estar limitada para que si el grupo de hilos está abrumado, puede rechazar temporalmente nuevas solicitudes. * La implementación predeterminada de EjecutorService es un Linked Blokingqueue ilimitado. */ private static threadpoolexecutor ejecutor = new ThreadPoolExeCutor (corepoolSize, corepoolSize+1, 10l, TimeUnit.seconds, new LinkedBlockingqueue <Runnable> (1000)); public static void main (string [] args) lanza interruptedException {list <future <string>> resultList = new ArrayList <Efture <String> (); // use la tarea asíncrona de envío y obtenga el valor de retorno como futuros resultados de resultados.add (ejecutor.submit (nuevas estadísticas ("tarea a", 1000))); resultList.Add (ejecutor.submit (nuevas estadísticas ("Tarea B", 1000))); resultList.Add (ejecutor.submit (nuevas estadísticas ("Tarea C", 1000))); resultList.Add (ejecutor.submit (nuevas estadísticas ("Tarea D", 1000))); resultList.Add (ejecutor.submit (nuevas estadísticas ("Tarea E", 1000))); // Resultado de la tarea transversal para (futuro <string> fs: resultlist) {try {system.out.println (fs.get ()); // Imprima los resultados de cada ejecución de tarea de línea, llame a futuro.get () para bloquear el hilo principal y obtener el resultado de retorno de la tarea asíncrona} Catch (interrupción -Excepción e) {E.PrintStacktrace ();; } catch (ExecutionException e) {E.PrintStackTrace (); } Finalmente {// Inicie una vez y ejecute las tareas enviadas previamente, pero no acepte nuevas tareas. Si se ha cerrado, la llamada no tiene otro efecto. ejecutor.shutdown (); }} System.out.println ("Todas las tareas estadísticas se ejecutan:" + sdf.format (new Date ())); } estadísticas de clase estática implementa Callable <String> {String statsName; int tiempo de ejecución; estadísticas públicas (string statsname, int runtime) {this.statsname = statsname; this.runtime = Runtime; } public String Call () {try {system.out.println (statsname+ "do stats comienza en"+ starttime); // simular la ejecución de la tarea TIEMH.Sleep (Runtime); System.out.println (statsname + "do estadísticas completadas en" + sdf.format (new date ())); } catch (InterruptedException e) {E.PrintStackTrace (); } devolver la llamada (); }}}Tiempo de ejecución
Los códigos anteriores son todos pseudocodes, y los siguientes son registros de prueba reales de más de 2,000 estudiantes.
2018-04-17 17: 42: 29.284 Registro de prueba de información 81E51AB031EB4ADA92743DDF66528D82 Ejecución secuencial de hilo y singido, tiempo dedicado: 3797
2018-04-17 17: 42: 31.452 Registro de prueba de información 81E51AB031EB4ADA92743DDF66528D82 Tarea paralela de subida-multa, tiempo dedicado: 2167
2018-04-17 17: 42: 33.170 Información de la prueba Registro 81E51AB031EB4ADA92743DDF66528D82 Tarea paralela-subprocesante-multa + Pool de subprocesos, tiempo dedicado: 1717
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.