PSP UT-2
|
|
Título del Test:
![]() PSP UT-2 Descripción: Programación multihilo. |



| Comentarios |
|---|
NO HAY REGISTROS |
|
¿Cuál es la principal distinción a nivel de recursos entre un proceso y un hilo (thread) en Java, basándose en la introducción del capítulo?. Los hilos tienen su propia tabla de archivos, mientras que los procesos comparten la tabla del sistema operativo. Los procesos comparten el espacio de memoria, mientras que los hilos tienen su propio espacio de direcciones. La gestión de los procesos es mucho más simple (ligeros) que la gestión de los hilos. Los hilos comparten el espacio de memoria del usuario, corriendo dentro del contexto del programa padre. Indique cuáles de los siguientes términos se utilizan para referirse a un hilo (thread en inglés). Proceso Pesado. Secuencia de Código. Hebra. Proceso Ligero. Si un programa de servidor web usa hilos para gestionar clientes, ¿cuál es la lógica detrás de esta arquitectura multihilo?. Permite que el servidor cree un nuevo proceso por cada cliente, asegurando el aislamiento. La interfaz gráfica para el administrador requiere un hilo dedicado. Permite al servidor atender nuevas peticiones concurrentemente, ya que la atención a un cliente no detiene al resto del programa. Asegura que todos los hilos se ejecuten en el orden exacto en que llegaron las peticiones. ¿Cuál de las siguientes es una forma válida y recomendada para crear la funcionalidad de un hilo en Java, según el texto?. Extender la clase Thread y sobrescribir el método run(). Sobrescribir el método main() de la clase Thread. Implementar la interfaz Callable. Utilizar el método start() como cuerpo del hilo. Al crear una instancia de una subclase de Thread, como PrimerHilo h = new PrimerHilo();, ¿qué método debe invocarse para que la JVM llame al método run() y el hilo comience su ejecución?. h.exec();. h.run();. h.init();. h.start();. El ejemplo HiloEjemplo1 (Pág. 70) muestra que la salida de los contadores de los hilos (Hilo 1, Hilo 2, Hilo 3) no sigue el orden de creación. ¿Qué principio fundamental de la programación multihilo demuestra este comportamiento?. Los hilos tienen prioridad sobre el hilo main. El método start() llama a run() de forma secuencia. Se produce un deadlock entre los hilos. La ejecución de los hilos es gestionada por el planificador de la JVM de forma no determinista. Para la creación de hilos en Java, ¿cuáles de las siguientes opciones son las dos formas canónicas proporcionadas por el paquete java.lang? (Múltiples respuestas correctas). Extendiendo la clase Thread. Extendiendo la clase Process. Implementando la interfaz Callable. Implementando la interfaz Runnable. Si una clase en Java, como un Applet, ya extiende otra clase base y el programador desea añadirle la funcionalidad de hilo, ¿qué mecanismo debe utilizar necesariamente?. Debe implementar la interfaz Runnable y sobrescribir su único método. Debe utilizar el constructor Thread(Runnable) y pasar this al crear el hilo. Debe reestructurar la herencia para que extienda Thread obligatoriamente. Las opciones B y C son correctas y se complementan. Considere el método Thread.sleep(long mils). ¿Cuál de las siguientes afirmaciones sobre su funcionamiento es correcta?. El hilo pasa al estado Bloqueado permanentemente hasta que un notify() lo despierte. El hilo cede voluntariamente la CPU a otros hilos, sin posibilidad de ser interrumpido. El hilo actualmente en ejecución pasa a dormir temporalmente, y puede lanzar la excepción InterruptedException. El hilo finaliza su ejecución después del tiempo especificado. ¿Cuál es la misión específica del método estático Thread.currentThread()?. Devuelve el número de hilos activos en el grupo. Devuelve el estado actual del hilo en ejecución. Devuelve una referencia al objeto hilo que se está ejecutando actualmente. Devuelve la ID del hilo que se está ejecutando actualmente. La primitiva void yield() es un mecanismo de planificación voluntario. ¿Qué acción concreta provoca en el hilo que la invoca?. Pone el hilo en estado BLOCKED esperando una notificación. Hace que el hilo actual de ejecución pare temporalmente y permita que otros hilos se ejecuten. Garantiza que el hilo se ejecute inmediatamente con la máxima prioridad. Detiene permanentemente el hilo. Según el texto, el método toString() de un hilo devuelve una cadena que representa su estado. ¿Qué información fundamental incluye esta representación en formato cadena? (Múltiples respuestas correctas). La prioridad asignada al hilo. El grupo de hilos al que pertenece. El nombre del hilo. El identificador (ID) único del hilo. Al realizar la Actividad 2.1, del texto de referencia se requiere el uso de sleep(). ¿Qué estructura de control de flujo es obligatoria rodear la llamada a sleep() para manejar la posible excepción lanzada, según se advierte en el texto?. Un bucle while (!interrupted()). Un bloque finally para asegurar la finalización. Una estructura switch-case. Un bloque try-catch para InterruptedException. En una aplicación Java que arranca y crea varios hilos sin especificar su pertenencia, ¿cuál es el grupo de hilos por defecto al que serán asignados?. El grupo del sistema (system group). Se lanza una excepción si no se asigna explícitamente un grupo. El grupo default. El grupo main. ¿Cuál es el propósito de la clase ThreadGroup en Java?. Se utiliza para manejar o agrupar hilos en las aplicaciones Java. Establece la prioridad máxima para todos los hilos del sistema. Define el cuerpo del hilo. Controla la ejecución del recolector de basura. Defina la característica principal de los hilos Daemon (demonio) en Java y cite un ejemplo clásico. Hilos con prioridad baja que se ejecutan en segundo plano; ejemplo: el recolector de basura (garbage collector). Hilos que no pueden ser interrumpidos; ejemplo: hilos de I/O. Hilos que no pueden acceder a recursos compartidos. Hilos de prioridad alta que se ejecutan siempre en primer plano; ejemplo: el planificador de la JVM. Si una clase PrimerHiloR implementa Runnable, y se ha creado una instancia PrimerHiloR h = new PrimerHiloR(), ¿cuál es la forma correcta de iniciar la ejecución del hilo usando el constructor Thread(Runnable target)?. new Thread.start();. new Thread.run();. h.start();. h.run(new Thread());. Indique cuáles de los siguientes métodos permiten obtener o modificar propiedades de un hilo en ejecución. (Múltiples respuestas correctas). getPriority(). getName(). setPriority(int p). run(). ¿Cuál es la misión y el valor devuelto del método activeCount()?. Devuelve un valor boolean que indica si el hilo está vivo. Devuelve la prioridad del hilo actual, como un int. Devuelve el número de hilos activos en el grupo de hilos del hilo actual, como un int. Devuelve la cuenta de las veces que el hilo ha sido planificado, como un long. Mencione tres de los estados de hilo válidos que devuelve el método Thread.State getState() de acuerdo con el texto. (Múltiples respuestas correctas). READY. NEW. BLOCKED. RUNNABLE. En el ejemplo HiloEjemplo2 (Pág. 72), si se itera i desde 0 hasta 2 y se llama a h.setPriority(i+1), y sabiendo que la prioridad por defecto del hilo main es 5, ¿cuál es la prioridad más alta asignada a uno de los hilos creados?. 5. 1. 3. 10. En el ejemplo de creación de hilos en grupos (HiloEjemplo2Grupos, Pág. 74), se utiliza el constructor new Thread(grupo, h, "Hilo X"). Para que este constructor sea válido, ¿qué debe implementar o extender el objeto h?. Debe implementar la interfaz Thread y extender Runnable. Debe extender la clase Thread. Debe ser una instancia de ThreadGroup. Debe implementar la interfaz Runnable. En el problema del Productor-Consumidor (Pág. 101), si el Consumidor es más rápido que el Productor y no hay sincronización, ¿por qué es necesaria esta?. Para impedir que el Consumidor termine antes que el Productor. Para asegurar que ambos hilos se ejecuten en el mismo procesador. Para evitar que el Productor ponga un número que ya está en la cola. Para evitar que el Consumidor recoja varias veces el mismo dato, o que no tenga datos que recoger. En el método get() de la clase Cola (Pág. 102 del texto de referencia), si disponible es true (hay número en la cola), ¿qué acción crucial realiza el método inmediatamente antes de devolver el valor del número?. Lanza una excepción indicando que el búfer está lleno. Llama al método put() para rellenar el número. Espera a un notify() del Productor. Establece la variable disponible a false para indicar que la cola está vacía. Una consecuencia de la falta de sincronización en el modelo Productor-Consumidor es que la ejecución no muestra la salida esperada (Pág. 105 del texto de referencia). ¿Qué acción se propone para evitar esta inconsistencia de visualización?. Aumentar la prioridad del Consumidor. Usar un bucle infinito para la producción. Eliminar el sleep() del Productor. Visualizar los mensajes de salida en la clase Cola, en lugar de en el Productor y el Consumidor. Cuando dos hilos (HiloA y HiloB, Pág. 93) acceden y modifican un objeto compartido (Contador), el problema es la condición de carrera sobre la variable c. ¿Cuál es el mecanismo de alto nivel en Java para garantizar que un método que accede a datos compartidos (como incrementa() o decrementa()) sea ejecutado por un único hilo a la vez?. Declarar el método como private. Utilizar el método Thread.yield(). Envolver el código en un bloque try-catch. Declarar el método como synchronized. En la clase SolicitaSuspender (Pág. 85 del texto de referencia), la llamada a notifyAll() se realiza dentro del método set(boolean b). ¿Cuál es el propósito exacto de notifyAll() en este contexto?. Detener permanentemente la ejecución de todos los hilos en espera. Liberar el lock del método synchronized de forma incondicional. Despertar a un único hilo que esté esperando (wait()) un cambio de estado. Indicar a todos los hilos que están esperando en el objeto que se ha producido un cambio de estado sobre el objeto, para que puedan reanudar la ejecución y reevaluar la condición. En el método esperandoParaReanudar() de la clase SolicitaSuspender (Pág. 85 del texto de referencia), el hilo se bloquea al llamar a wait(). ¿Qué otra acción crucial realiza la primitiva wait() de forma atómica?. Bloquea la CPU del sistema. Libera la exclusión mutua (lock) adquirida por el hilo al entrar al método synchronized. Llama a notifyAll() para despertar a otros hilos. Establece la variable suspender a false. Según el texto (Pág. 85 del texto de referencia), ¿cuál es el requisito estricto para que un hilo pueda invocar el método wait()?. El hilo debe tener prioridad máxima. La llamada a wait() solo puede realizarse dentro de un método o bloque sincronizado (synchronized). El hilo debe estar en el estado RUNNABLE. El hilo debe ser un hilo Daemon. El método stop() para detener un hilo está en desuso. ¿Cuál es la forma moderna y recomendada de finalizar la ejecución de un hilo de forma controlada?. Usar el método isDaemon(). Dejar que el método run() devuelva el control (finalice). Llamar al método activeCount(). Usar la primitiva yield(). Si un hilo está bloqueado en una llamada a sleep(long mils), y otro hilo invoca interrupt() sobre él, ¿qué sucede, y cómo se gestiona ese evento?. El hilo se bloquea permanentemente. La llamada a sleep() es ignorada, y el hilo continúa ejecutándose. Se lanza la excepción InterruptedException, que debe ser capturada para gestionar la interrupción. El hilo pasa al estado TERMINATED. ¿Cuál es la función del método join() cuando es invocado por un hilo sobre otro hilo (h1.join())?. Permite que el hilo h1 ceda su tiempo de CPU al hilo que hace la llamada. Fuerza al hilo h1 a unirse al grupo de hilos actual. El hilo que hace la llamada (main o un hilo diferente) se queda en espera hasta que el hilo h1 muera (finalice). Inicia la ejecución del hilo h1. En el contexto del ejemplo EjemploJoin (Pág. 87 del texto de referencia), si el hilo main invoca h1.join(), y h1 está configurado para ejecutar un bucle for de larga duración, ¿qué sucede con la ejecución del hilo main?. Continúa inmediatamente con la siguiente instrucción después de h1.join(). Lanza la excepción InterruptedException. Se queda en espera hasta que el bucle for de h1 finalice y el método run() de h1 devuelva el control. Espera indefinidamente a que un notify() despierte a h1. En el ejemplo de asignación de prioridades (EjemploHiloPrioridad1, Pág. 89), se observa que en algunas ejecuciones el hilo con la prioridad más baja obtiene un contador con un valor similar o incluso mayor que el de prioridad máxima. ¿Qué conclusión importante sobre la planificación de hilos en Java se extrae de esta observación?. La prioridad solo afecta a la creación de hilos, no a su ejecución. El contador se incrementa solo en el hilo main. La prioridad es solo una sugerencia al planificador, y no garantiza un orden de ejecución estricto. Es un error de programación que requiere el uso de yield(). En el ejemplo donde HiloA incrementa el contador y HiloB lo decrementa (Pág. 93 del texto de referencia), si los métodos incrementa() y decrementa() de la clase Contador no están sincronizados, ¿cuál es el problema de concurrencia que ocurrirá. Deadlock (interbloqueo) de los hilos. Condiciones de carrera sobre la variable compartida, que llevarán a un valor final inconsistente. Despertares espurios (spurious wakeups). ¿Cuál es la razón explícita para añadir un sleep(100) intencionadamente dentro del bucle run() de HiloA y HiloB (Pág. 93 del texto de referencia)?. Para garantizar que los hilos terminen al mismo tiempo. Para aumentar la prioridad del hilo. Para evitar que la CPU realice todo un hilo y después otro, permitiendo observar mejor el efecto de la concurrencia (entrelazamiento). En el ejemplo de BloqueoHilos (Pág. 99), si se desea que un hilo complete la impresión de una cadena (PintaCadena()) antes de que otro hilo comience, ¿cuáles de las siguientes soluciones son aplicables para la exclusión mutua de dicho método? (Múltiples respuestas correctas). Usar un Thread.yield() después de cada instrucción de impresión. Utilizar un bloque synchronized (this) que envuelva el contenido del método PintaCadena(). Declarar el método PintaCadena() como synchronized. Usar wait() al inicio del método. El texto advierte que la ejecución del ejemplo HiloEjemplo1 (Pág. 70) no siempre es la misma. ¿Qué demuestra esta observación respecto al orden de ejecución de los hilos?. Demuestra que los hilos no se ejecutan en el orden en que fueron creados. Demuestra que el método run() se llama antes que start(). Demuestra que el hilo main siempre tiene la máxima prioridad. En el ejemplo Productor/Consumidor (Pág. 101 del texto de referencia), el Productor utiliza un sleep(100), pero el Consumidor no tiene pausa. ¿Cuál es el resultado intencionado de esta diferencia en la velocidad de los hilos?. Se garantiza que el Productor siempre irá más rápido. Se asegura que el Consumidor pueda bloquearse. Se hace que el Consumidor sea más rápido que el Productor, exponiendo la necesidad de sincronización. En el problema de "Adivinar un número" (Pág. 109), el hilo Jugador dentro de su método run() se repite hasta que el juego se acaba. ¿Qué condición de sincronización debe comprobar el Jugador en cada iteración para determinar si puede jugar o si debe esperar?. Si es su turno de jugar, lo cual requiere acceder al objeto Árbitro compartido. Si el Árbitro ha lanzado un notifyAll(). Si el juego ya ha finalizado. Si el número a adivinar es par o impar. |




