Uso de subprocesos múltiples, comunicación de subprocesos múltiples y métodos comunes de subprocesos múltiples

Multihilo

1. Proceso (proceso) e hilo (hilo)

  1. Proceso: Es un proceso de ejecución de un programa, es un concepto dinámico. Es la unidad de asignación de recursos del sistema.
  2. Por lo general, un proceso puede contener varios subprocesos, por supuesto, hay al menos un subproceso en un proceso. Thread es la unidad de programación y ejecución de la CPU. Hilo predeterminado: hilo de usuario, hilo de demonio.
  3. Formas de crear hilos:
  • método uno:
    • La clase de hilo personalizada hereda la clase de hilo
    • Reescribir run (), escribir el cuerpo de ejecución del hilo
    • Cree un objeto de hilo y llame al método de inicio para iniciar el hilo.
    • Nota: Es posible que el inicio del hilo no se ejecute inmediatamente, está programado y ejecutado por la CPU.
  • Método dos:
    • Definir una clase que implemente la interfaz Runnable
    • Implementar run (), escribir el cuerpo de ejecución del hilo
    • Cree un objeto de hilo y llame al método de inicio para iniciar el hilo.
    • Nota: Evite las limitaciones de los objetos de herencia única de Java, flexible y conveniente, y conveniente para que el mismo objeto sea utilizado por varios subprocesos. apoderado
  • Método tres:
    • Para implementar la interfaz invocable, se requiere el tipo de valor de retorno
    • Para reescribir el método Call, es necesario lanzar una excepción
    • Crea una audiencia objetivo
    • Crear servicios de ejecución: ExecutorService ser = Executors.newFixedThreadPool (nThreads);
    • Realizar envío: Future r1 = result.submit (tarea)
    • Obtenga el resultado: boolean r1 = result.get ()
    • Cierre el servicio: ser.shutdownNow ()

2. Proxy estático

  • Tanto el objeto real como el objeto proxy deben implementar la misma interfaz.
  • El objeto proxy debe representar el objeto real.
  • Los objetos proxy pueden hacer cosas que los objetos reales no pueden.
  • Los objetos reales pueden enfocarse en hacer sus propias cosas.

3.Lamda

  1. La definición de interfaz funcional: cualquier interfaz, si contiene solo un método abstracto, entonces es una interfaz funcional.
  2. para resumir:
  • La expresión lambda se puede simplificar en una línea solo si solo hay una línea de código. Si hay varias líneas, envuélvala con un bloque de código;
  • La interfaz de requisito previo es una interfaz funcional
  • También se pueden eliminar varios parámetros del tipo de parámetro. Si desea eliminarlos, debe eliminarlos y debe agregar paréntesis.

4. Estado del hilo

Inserte la descripción de la imagen aquí

  1. Estado del hilo. Un hilo puede estar en uno de los siguientes estados:
  • NEW Los subprocesos que no se han iniciado están en este estado.
  • RUNNABLE El subproceso que se ejecuta en la máquina virtual Java se encuentra en este estado.
  • BLOQUEADO Los subprocesos que están bloqueados esperando que el monitor se bloquee están en este estado.
  • ESPERANDO Un hilo que está esperando a que otro hilo realice una acción específica se encuentra en este estado.
  • TIMED_WAITING Un subproceso que está esperando que otro subproceso realice una acción durante el tiempo de espera especificado se encuentra en este estado.
  • TERMINADO Los subprocesos que han salido se encuentran en este estado.

5. Métodos habituales de enhebrado

  1. start () y run ()
    start (): inicia un hilo, no hay secuencia entre hilos, se cambia de un lado a otro de acuerdo con el intervalo de tiempo asignado por la CPU.
    run (): el método se usa para encapsular el código del hilo
  2. dormir () 与 interrumpir ()
  • dormir () hilo dormir
    • sleep (tiempo) especifica el número de milisegundos que el hilo actual está bloqueado;
    • El sueño tiene una excepción InterrupttedException;
    • Una vez alcanzado el tiempo de reposo, el subproceso entra en estado listo;
    • el sueño puede simular el retraso de la red, la cuenta atrás, etc .;
    • Cada objeto tiene un candado, dormir no liberará el candado.
    • Simular el retraso de la red: la aparición de problemas de amplificación.
  • interrumpir():
    • Despierta el programa durmiente y llama al método interrupt (), que hará que el método sleep () arroje una InterruptedException. Cuando el método sleep () arroja una excepción, el método sleep se interrumpirá y el programa continuará ejecutándose.
  1. esperar () 与 notificar ()
  • wait (): hace que el subproceso entre en el estado de bloqueo de espera y esperará hasta que otros subprocesos lo despierten mediante notificar () o notificar a todos. Este método solo se puede llamar en un método síncrono. Si el hilo actual no es el titular del bloqueo, este método arroja una IllegalMonitorStateException. esperar (tiempo de espera largo): ejecución automática cuando se acaba el tiempo, similar a dormir (milisegundos largos)
  • notificar (): Este método solo se puede llamar en un método síncrono o el mismo internamente. Se selecciona uno al azar (nota: solo se notificará a uno) para llamar al hilo del método de espera en el objeto para liberar su estado de bloqueo
  • notifyAll (): despierta todos los objetos de espera
  1. La diferencia entre dormir y esperar
  • dormir en la clase Thread, esperar en la clase Object
  • dormir no liberará el bloqueo, esperar liberará el bloqueo
  • El sueño usa interrupt () para despertar, y esperar requiere notificar o notificar a Todos para notificar
  1. unirse
  • Únase a los subprocesos de fusión, después de que se complete la ejecución de este subproceso, ejecute otros subprocesos y otros subprocesos se bloquean.
  1. ceder hilo cortés
  • Hilo cortés, deje que el subproceso que se está ejecutando actualmente se detenga, pero no se bloquee;
  • Deje que el hilo pase del estado de ejecución al estado listo;
  • Deje que la CPU vuelva a programar, es posible que la cortesía no tenga éxito.

5. Prioridad del hilo

  1. Java proporciona un programador de subprocesos para monitorear todos los subprocesos que entran en el estado listo después del inicio en el programa El planificador de subprocesos determina qué subproceso debe programarse para su ejecución de acuerdo con la prioridad.
  2. La prioridad del hilo se expresa en números, que van del 1 al 10
  • Thread.MIN_PRIORITY = 1;
  • Thread.MAX_PRIORITY = 10;
  • Thread.NORM_PRIORITY = 5;
  1. Utilice el siguiente método para cambiar y obtener la prioridad
    getPriority () setPriority (int x);

6. Hilo de demonio

  1. Los hilos se dividen en hilos de usuario y hilos de demonio
  2. La máquina virtual debe asegurarse de que el hilo del demonio finalice la ejecución
  3. La máquina virtual no necesita esperar a que el hilo del demonio termine de ejecutarse
  4. Por ejemplo, registro de operaciones de grabación en segundo plano, monitoreo de memoria, recolección de basura, etc.

7. Sincronización de hilos

  1. Concurrencia: el mismo objeto es operado por varios subprocesos
  2. La sincronización de subprocesos es en realidad una especie de mecanismo de espera. Varios subprocesos que necesitan acceder a este objeto al mismo tiempo ingresan a este grupo de espera de objetos para formar una cola, esperando que se agote el subproceso anterior y luego usan el siguiente subproceso. Cola + bloqueo
  3. Sincronización de subprocesos
  • Para garantizar la exactitud del método de datos cuando se accede a él, se agrega el mecanismo de bloqueo sincronizado al acceder . Cuando un hilo obtiene un bloqueo exclusivo del objeto y monopoliza el recurso, otros hilos deben esperar y liberar el bloqueo después de su uso.
  • Un hilo que mantiene un bloqueo hará que otros hilos que necesitan este bloqueo se suspendan temporalmente;
  • En una competencia de subprocesos múltiples, bloquear y liberar bloqueos provocará más cambios de contexto y retrasos en la programación, lo que provocará problemas de rendimiento;
  • Si un subproceso de alta prioridad espera a que un subproceso de baja prioridad libere el bloqueo, provocará una inversión de prioridad y problemas de rendimiento.
  • El método sincronizado controla el acceso al "objeto". Cada objeto corresponde a un bloqueo. Cada método sincronizado debe obtener el bloqueo del objeto que llama al método antes de que pueda ejecutarse. De lo contrario, el hilo se bloqueará. Una vez que se ejecute el método, el bloqueo será exclusivo. El bloqueo no se libera hasta que el método regresa y el hilo bloqueado puede adquirir el bloqueo y continuar la ejecución. Defectos: si se aplica un método grande para sincronizar, afectará la eficiencia.

8. Punto muerto

  • Cada uno de los recursos múltiples ocupa algunos recursos compartidos y espera a que se ejecuten los recursos ocupados por otros subprocesos. Como resultado, dos o más subprocesos están esperando los recursos liberados del otro y todos dejan de ejecutarse. Un determinado bloque de código tiene dos al mismo tiempo. Cuando más de un objeto está bloqueado , puede ocurrir un problema de interbloqueo.

    1. Condiciones mutuamente excluyentes: un recurso solo puede ser utilizado por un proceso a la vez;
    2. Condiciones de solicitud y retención: cuando un proceso se bloquea al solicitar recursos, conserva los recursos adquiridos;
    3. Condiciones de no privación: el proceso ha obtenido recursos y no se puede privar a la fuerza antes de que se agoten;
    4. Condición de espera circulante: se forma una especie de relación de recurso de espera cíclica entre varios procesos.

8.Bloqueo de bloqueo

  • La interfaz java.util.concurrent.locks.Lock es una herramienta para controlar múltiples subprocesos para acceder a recursos compartidos. El bloqueo proporciona acceso exclusivo a los recursos compartidos. Solo un hilo puede bloquear el objeto Bloquear a la vez, y el objeto Bloquear debe adquirirse antes de que el hilo comience a acceder al recurso compartido.
  • La clase ReentranLock implementa Lock, que tiene la misma semántica de simultaneidad y memoria que sincronizada. En el control de seguridad de subprocesos, ReentranLock es más común, que puede mostrar bloqueos y liberar bloqueos.

9.Comparación sincronizada y de bloqueo

  1. El bloqueo es un bloqueo de pantalla, (abrir y cerrar manualmente el bloqueo) sincronizado es un bloqueo implícito, que se libera automáticamente fuera de alcance.
  2. El bloqueo solo tiene bloques de código, el sincronizado tiene bloques de código y bloqueos de método.
  3. Al usar bloqueos de bloqueo, JVM dedicará menos tiempo a programar subprocesos, mejor rendimiento y buena escalabilidad.

10. Hilo de comunicación

Nombre del método efecto
Espere() Indica que el subproceso ha estado esperando hasta que otros subprocesos notifiquen, a diferencia de la suspensión, el bloqueo se liberará.
espera (tiempo de espera largo) Especifique la cantidad de milisegundos a esperar
notificar() Despierta un hilo de espera
notificar a todos () Despierta el hilo que llama al método wait () en el mismo objeto, el hilo con la prioridad más alta se programa primero
  1. Usando la palabra clave volátil,
    varios subprocesos monitorean una variable al mismo tiempo.Cuando una variable ocurre en esta variable, el subproceso puede percibir y ejecutar el negocio correspondiente.
  2. Utilice los métodos wait () y notificar () de la
    clase Object. La clase Object proporciona métodos para la comunicación entre subprocesos: esperar (), notificar (), notifyaAl (), que son la base de la comunicación multiproceso, y la idea de esta implementación es natural Es comunicación entre hilos.
    Nota: Después de que el subproceso A envía la notificación de activación de notificación (), aún termina el negocio de su propio subproceso y luego el subproceso B comienza a ejecutarse. Esto también muestra que el método notificar () no libera el bloqueo, pero el método esperar () libera el bloqueo.
  3. Después de usar la clase de herramienta JUC CountDownLatch
    jdk1.5, se proporcionan muchas herramientas relacionadas con la programación concurrente en el paquete java.util.concurrent, que simplifica la escritura de nuestro código de programación concurrente. *** CountDownLatch *** se basa en el marco AQS, que es equivalente a También mantiene un estado de variable compartida entre subprocesos.
  4. Basic LockSupport realiza el bloqueo y la
    activación entre subprocesos. LockSupport es una herramienta muy flexible para realizar el bloqueo y la activación entre subprocesos. No necesita prestar atención a si esperar a que el subproceso continúe o activar el subproceso para que se ejecute primero, pero debe saber el nombre del subproceso.

11 grupo de hilos

  1. Antecedentes: la creación y destrucción frecuentes de recursos que se utilizan particularmente, como los subprocesos con la primera concurrencia, tienen un gran impacto en el rendimiento.
  2. Idea: cree varios subprocesos con anticipación, colóquelos en el grupo de subprocesos, consígalos directamente cuando los use y vuelva a colocarlos en el grupo después de su uso. Puede evitar la creación y destrucción frecuentes y realizar la reutilización.
  3. beneficio:
  • Mejore la velocidad de respuesta (reduzca el tiempo para crear hilos)
  • Reducir el consumo de recursos (reutilizar subprocesos en el grupo de subprocesos, no es necesario crear cada vez)
  • Facilitar la gestión de subprocesos

Supongo que te gusta

Origin blog.csdn.net/Zmd_23/article/details/108476764
Recomendado
Clasificación