simultaneidad Java


El lenguaje de programación Java y la máquina virtual Java (JVM) se han diseñado para admitir la programación concurrente y toda la ejecución se lleva a cabo en el contexto de subprocesos . Se puede acceder a los objetos y recursos mediante muchos subprocesos separados; cada subproceso tiene su propia ruta de ejecución, pero potencialmente puede acceder a cualquier objeto en el 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 admitir 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 los subprocesos (también llamados procesos ligeros ). Los procesos múltiples solo se pueden realizar 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 subproceso denominado subproceso principal. El subproceso principal tiene la capacidad de crear subprocesos adicionales como Runnableu Callableobjetos. (La Callableinterfaz es similar a Runnable, en el sentido de que ambos están diseñados para clases cuyas instancias son potencialmente ejecutadas por otro subproceso. Sin Runnableembargo, A , no devuelve un resultado y no puede generar una excepción verificada).

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 nativos del sistema operativo. Cada implementación de JVM puede hacerlo de una manera diferente.

Cada subproceso está asociado con una instancia de la clase Subproceso. Los subprocesos se pueden administrar directamente mediante objetos Thread o mediante mecanismos abstractos, como Executorcorreos electrónicos y java.util.concurrentcolecciones.

Una interrupción es una indicación para un subproceso de que debe detener lo que está haciendo y hacer otra cosa. Un subproceso envía una interrupción invocando la interrupción en el objeto Subproceso para que se interrumpa el subproceso. 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 arrojando un InterruptedExceptionestado de interrupción borra cuando lo hace. Sin embargo, siempre es posible que el estado de interrupción se establezca de nuevo inmediatamente, por otro hilo que invoque la interrupción.