El concepto de Java Threading <Br /> A diferencia de la mayoría de los otros lenguajes de computadora, Java admite programación multiproceso en incorporado.
Un programa de múltiples subprocesos contiene dos o más piezas que se ejecutan simultáneamente. Cada parte de este tipo en el programa se llama hilo, y cada hilo tiene una ruta de ejecución independiente. Por lo tanto, la lectura múltiple es una forma especial de multitarea.
Debe conocer la multitarea porque en realidad es compatible con todos los sistemas operativos modernos. Sin embargo, hay dos tipos distintos de multitarea: basada en procesos y basadas en hilos. Es muy importante comprender las diferencias entre los dos.
Para muchos lectores, la multitarea basada en procesos es una forma más familiar. Un proceso es esencialmente un programa de ejecución. Por lo tanto, la multitarea basada en procesos se caracteriza al permitir que su computadora ejecute dos o más programas simultáneamente. Por ejemplo, la multitarea basada en procesos le permite ejecutar el compilador Java simultáneamente mientras usa un editor de texto. En la multitarea basada en procesos, un programa es la unidad de código más pequeña asignada por el programador.
En un entorno multitarea basado en hilos, los hilos son la unidad de ejecución más pequeña. Esto significa que un programa puede realizar funciones de dos o más tareas simultáneamente. Por ejemplo, un editor de texto puede formatear el texto mientras se imprime. Por lo tanto, los programas de múltiples procesos manejan "imágenes grandes", mientras que los programas de múltiples subprocesos manejan detalles.
Los programas multiproceso requieren menos gastos administrativos que los programas de procesos múltiples. Los procesos son tareas de peso pesado que requieren su propio espacio de direcciones independiente. La comunicación entre procesos es costosa y restringida. La transformación entre procesos también es muy costosa. Los hilos, por otro lado, son jugadores livianos. Comparten el mismo espacio de direcciones y comparten el mismo proceso juntos. La comunicación entre subcontratación es barata, y la conversión entre huellas también es de bajo costo. Cuando un programa Java utiliza un entorno de procesamiento de tareas múltiples, el programa de procesos múltiples no está controlado por Java, mientras que Java controla la múltiple subproceso.
La lectura múltiple lo ayuda a escribir programas eficientes con la máxima utilización de la CPU, ya que el tiempo de inactividad se mantiene al mínimo. Esto es crucial para entornos de interconexión de red interactivos que se ejecutan en Java, porque el tiempo libre es público. Por ejemplo, la tasa de transmisión de datos de la red es mucho más baja que la capacidad de procesamiento de la computadora, y la velocidad de lectura y escritura de los recursos del sistema de archivos locales es mucho más baja que la de la CPU. . En un entorno tradicional único, su programa debe esperar a que cada tarea se complete antes de realizar el siguiente paso, aunque la CPU tiene mucho tiempo libre. Multithreading le permite obtener y aprovechar al máximo este tiempo libre.
Modelo de subproceso de Java
El sistema de tiempo de ejecución Java se basa en hilos de muchas maneras, y todos los diseños de biblioteca de clases tienen en cuenta la cuenta multithreading. De hecho, Java usa hilos para que todo el entorno sea asíncrono. Esto ayuda a reducir la parte inválida al prevenir el desperdicio de bucles de CPU.
Para comprender mejor las ventajas de un entorno multiproceso, se puede comparar con sus controles. El método de procesamiento de un sistema único es utilizar un método de bucle de eventos llamado sondeo. En este modelo, el control de un solo hilo se ejecuta en un bucle infinito, encuestando una secuencia de eventos para determinar qué hacer a continuación. Una vez que el dispositivo de votación devuelve una señal de que el archivo de red está listo para leerse, el control de programación del bucle de eventos administra el controlador de eventos apropiado. Hasta que el controlador de eventos regrese, no ocurren otros eventos en el sistema. Esto desperdicia tiempo de CPU. Esto hace que parte del programa ocupe el sistema exclusivamente y evite la ejecución de otros eventos. En general, en un entorno único, cuando un hilo bloquea (bloquea, suspende la ejecución) mientras espera recursos, todo el programa deja de funcionar.
La ventaja de Java multithreading es que cancela el mecanismo principal de bucle/encuesta. Se puede pausar un hilo sin afectar otras partes del programa. Por ejemplo, el tiempo de inactividad generado cuando un subproceso lee datos de la red o espera la entrada del usuario se puede utilizar en otro lugar. Multithreading permite que un bucle en vivo duerma por un segundo en cada brecha de cuadro sin detener todo el sistema. Hay un bloqueo de hilo en un programa Java, solo se suspende un hilo y los otros hilos continúan funcionando.
Existen hilos en varios estados. El hilo puede estar ejecutándose. Puede funcionar mientras obtenga tiempo de CPU. El hilo en ejecución se puede suspender e interrumpir temporalmente su ejecución. Se puede reanudar un hilo suspendido, lo que permite que continúe corriendo desde donde se detuvo.
En cualquier momento, el hilo puede terminar, lo que interrumpe inmediatamente su funcionamiento. Una vez terminado, el hilo no se puede restaurar.
Prioridad del hilo
Java prioriza cada hilo para determinar cómo tratar el hilo en comparación con otros hilos. La prioridad del hilo es un entero que detalla la relación prioritaria entre los hilos. Como valor absoluto, la prioridad no tiene sentido; En su lugar, se usa la prioridad del subproceso para determinar cuándo cambiar de un hilo en ejecución a otro. Esto se llama "Switch de contexto". Las reglas que determinan la aparición de la conversión de contexto son simples:
Los hilos pueden renunciar automáticamente al control. En el caso de E/S indeciso, el sueño o el bloqueo se realizan mediante concesiones explícitas. Bajo esta suposición, se detectan todos los demás hilos y se otorga el hilo de mayor prioridad listo para ejecutar a la CPU.
Los hilos pueden ser adelantados por hilos de alta prioridad. En este caso, el hilo de baja prioridad no se rinde activamente, el procesador solo está ocupado primero, sin importar lo que esté haciendo, el procesador está ocupado por el hilo de alta prioridad. Básicamente, una vez que un hilo de alta prioridad está a punto de funcionar, se ejecuta. Esto se llama multitarea prioritaria.
La situación es un poco complicada cuando dos hilos de la misma prioridad compiten por los ciclos de CPU. Para sistemas operativos como Windows 98, los subprocesos con igual prioridad dividen automáticamente el tiempo en el modo de bucle. Para otros sistemas operativos, como Solaris 2.x, los hilos prioritarios se abandonan automáticamente en relación con sus pares. Si este no es el caso, otros hilos no se ejecutarán.
Advertencia: la conversión de contexto de hilos de menor prioridad en diferentes sistemas operativos puede generar errores.
Sincronización
Debido a que la lectura múltiple introduce un comportamiento asincrónico en su programa, debe haber formas de mejorar la sincronización cuando la necesite. Por ejemplo, si desea que dos hilos se comuniquen entre sí y compartan una estructura de datos compleja, como una secuencia de listas vinculadas, necesita alguna forma de asegurarse de que no estén en conflicto entre sí. Es decir, debe evitar que un hilo escriba datos mientras otro hilo está leyendo datos de la lista vinculada. Con este fin, Java implementa otro método basado en el antiguo modelo de sincronización entre procesos: monitor. El proceso de gestión es un mecanismo de control definido primero por Carhoee.
Puede pensar en el proceso de gestión como una caja pequeña que controla solo un hilo. Una vez que una rosca ingresa a una tubería, todas las roscas deben esperar hasta que la rosca salga de la tubería. De esta manera, la gerencia se puede utilizar para evitar que los recursos compartidos sean manipulados por múltiples hilos.
Muchos sistemas de subprocesos múltiples consideran el proceso de gestión como un objeto al que el programa debe referirse y operar claramente. Java proporciona una solución clara. No hay clase de "monitor"; en su lugar, cada objeto tiene su propia manipulación implícita, que se carga automáticamente cuando se llama al método de sincronización del objeto. Una vez que se incluye un hilo en un método de sincronización, ningún otro hilo puede llamar al método de sincronización del mismo objeto. Esto le permite escribir un código múltiple muy claro y conciso, ya que el soporte de sincronización está integrado en el idioma.
Entrega de mensajes
Después de dividir el programa en varios hilos, debe definir la conexión entre cada hilo. Al planificar en la mayoría de los otros idiomas, debe confiar en el sistema operativo para establecer la comunicación entre subprocesos. Esto ciertamente aumentará el costo. Sin embargo, Java proporciona una forma limpia y de bajo costo de hablar entre múltiples lecturas, llamando a métodos predefinidos que todos los objetos tienen. El sistema de mensajería de Java permite que un hilo ingrese un método síncrono de un objeto y luego espere allí hasta que otros hilos lo notifiquen explícitamente.
Clase de hilo e interfaz ejecutable
El sistema de múltiples subprocesos de Java se basa en la clase de subprocesos, sus métodos y su interfaz de co-compañía ejecutable. La clase de hilo encapsula la ejecución de hilos. Dado que no puede referirse directamente al estado del hilo en ejecución, debe procesarlo a través de su proxy, por lo que se genera la instancia de hilo. Para crear un nuevo hilo, su programa debe extender el hilo o implementar la interfaz ejecutable.
La clase de hilos define varios métodos para ayudar a administrar hilos. Los métodos utilizados en este capítulo se muestran en la tabla: