Concurrencia de Java


El lenguaje de programación Java y la máquina virtual Java (JVM) se han diseñado para admitir programación concurrente , y toda la ejecución tiene lugar en el contexto de subprocesos . Se puede acceder a los objetos y recursos mediante muchos subprocesos separados; cada hilo tiene su propia ruta de ejecución, pero potencialmente puede acceder a cualquier objeto del programa. El programador debe asegurarse de que el acceso de lectura y escritura a los objetos esté correctamente coordinado (o " sincronizado") entre subprocesos. La sincronización de subprocesos garantiza que los objetos sean modificados por un solo subproceso a la vez y que se impida que los subprocesos accedan a objetos parcialmente actualizados durante la modificación por otro subproceso. El lenguaje Java tiene construcciones integradas para respaldar esta coordinación.

La mayoría de las implementaciones de la máquina virtual Java se ejecutan como un solo proceso y en el lenguaje de programación Java, la programación concurrente se ocupa principalmente de subprocesos (también llamados procesos ligeros ). Solo se pueden realizar múltiples procesos con múltiples JVM.

Los subprocesos comparten los recursos del proceso, incluida la memoria y los archivos abiertos. Esto hace que la comunicación sea eficiente, pero potencialmente problemática. Cada aplicación tiene al menos un hilo llamado hilo principal. El hilo principal tiene la capacidad de crear hilos adicionales Runnableu Callableobjetos. (La Callableinterfaz es similar a Runnable, en el sentido de que ambas están diseñadas para clases cuyas instancias son potencialmente ejecutadas por otro hilo. A Runnable, sin embargo, no devuelve un resultado y no puede lanzar una excepción marcada).

Cada subproceso se puede programar en un núcleo de CPU diferente o usar la división de tiempo en un solo procesador de hardware, o la división de tiempo en muchos procesadores de hardware. No existe una solución genérica sobre cómo se asignan los subprocesos de Java a los subprocesos del sistema operativo nativo. Cada implementación de JVM puede hacerlo de una manera diferente.

Cada hilo está asociado con una instancia de la clase Thread. Los subprocesos se pueden administrar directamente usando objetos Thread o usando mecanismos abstractos como Executors y java.util.concurrentcolecciones.

Una interrupción es una indicación a un hilo de que debe detener lo que está haciendo y hacer otra cosa. Un hilo envía una interrupción invocando la interrupción en el objeto Thread para que se interrumpa el hilo. El mecanismo de interrupción se implementa mediante un indicador interno conocido como estado de interrupción. La invocación Thread.interruptestablece esta bandera. Por convención, cualquier método que salga lanzando un InterruptedExceptionborrado interrumpe el estado cuando lo hace. Sin embargo, siempre es posible que el estado de la interrupción se establezca de nuevo inmediatamente por otro hilo que invoque la interrupción.