-
¿Cuáles son todos los estados del objeto
Thread
?- NUEVO
- EJECUTABLE
- OBSTRUIDO
- ESPERA
- TIMED_WAITING
- TERMINADO
-
¿A qué estados puede pasar un hilo al entrar en un bloque
synchronized
?- EJECUTABLE
- OBSTRUIDO
En RUNNABLE, si el bloque de código marcado
synchronized
no está ocupado por otro hilo. De lo contrario, nuestro hilo recibirá el estado BLOQUEADO y esperará a que se libere el objeto mutex. - ¿A qué estado irá el hilo al llamar al método
wait()
?Llamar a este método coloca el hilo en el estado de ESPERA.
El métodowait()
solo se puede llamar dentro de un bloquesynchronized
en un objeto mutex que ha sido "bloqueado" por el hilo actual; de lo contrario, el método generará una excepción IllegalMonitorStateException .Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
Cuando se llama a un métodowait()
, el hilo actual libera el bloqueo del objetomonitor
y entra en el estado de ESPERA, esperando que otro hilo llamemonitor.notify()
al métodomonitor.notifyAll()
. Tan pronto como esto suceda, el hilo se activará y si el monitor no estaba ocupado, lo tomará y continuará trabajando.
Si el monitor está ocupado por otro subproceso, el subproceso actual pasará al estado BLOQUEADO. -
¿A qué estado irá el hilo al llamar al método
Llamar a este método coloca el hilo en el estado TIMED_WAITING.wait(500)
?
Por analogía con el métodowait()
,wait(timeout)
solo se puede llamar dentro de un bloquesynchronized
en un objeto mutex que ha sido "bloqueado (bloqueado)" por el hilo actual.Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(500); … }
Al llamar al método
wait()
, el hilo actual libera el bloqueo del objetomonitor
y entra en modo de suspensión durante 500 milisegundos. El objetomonitor
puede ser capturado por otro hilo.
Después de 500 milisegundos, el hilo se activará y, simonitor
no estaba ocupado, lo tomará y continuará trabajando.
Si el monitor está ocupado por otro subproceso, el subproceso actual pasará al estado BLOQUEADO.¿A qué estado irá el hilo al llamar al método
notify()
?Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
Despuésmonitor.wait()
, el hilo pasará al estado de ESPERA. Un métodonotify()
llamado por otro subproceso en un objetomonitor
moverá el subproceso del estado EN ESPERA al estado EJECUTABLE a menos que el objeto monitor sea capturado por otro subproceso; de lo contrario, al estado BLOQUEADO. -
¿A qué estado irá el hilo al llamar al método
notifyAll()
?notifyAll()
"Se quedará" todos los hilos. Uno de todos los subprocesos "inactivos" (ESPERA) pasará al estado EJECUTABLE, se hará cargo del monitor del objeto que se está utilizando y continuará su trabajo. El resto estará en estado BLOQUEADO. Tan pronto como el primer subproceso "despertador" libere el monitor, que todos los demás están esperando, su destino será repetido por el siguiente subproceso (un subproceso arbitrario pasará del estado BLOQUEADO al estado EJECUTABLE). Esto continuará hasta que todos los subprocesos "despertados" abandonen el estado BLOQUEADO. -
Tres subprocesos en el bloque sincronizado se denominan
Dos de ellos pasarán al estado BLOQUEADO, uno al estado EJECUTABLEwait()
objeto mutex. ¿A qué estado llegarán estos subprocesos si llama el cuarto subprocesonotifyAll()
? -
¿ En qué se diferencia
A pesar de que yjoin(500)
dewait(500)
?join(500)
transferiráwait(500)
el hilo actual al estado TIMED_WAITING, existen diferencias significativas entre ellos:join(500)
llamado en un hilo,wait(500)
llamado dentro de un bloque sincronizado en el objeto en el que está sincronizado este bloque.
Cuando se llama,join(500)
el hilo actual esperará 500 milisegundos hasta quejoin()
se complete el hilo cuyo método fue llamado.
Cuando se llama,wait(500)
el hilo actual liberará el bloqueo del objeto sincronizado y entrará en suspensión durante 500 milisegundos.
Después de 500 milisegundos, en ambos casos los subprocesos seguirán funcionando. -
¿ En qué se diferencia
wait(500)
desleep(500)
?sleep(500)
llamado en un hilo,wait(500)
llamado dentro de un bloque sincronizado en el objeto en el que este bloque está sincronizado.
Cuando se llama,sleep(500)
el hilo actual esperará 500 milisegundos y luego continuará su trabajo.
Cuando se llama,wait(500)
el hilo actual liberará el bloqueo del objeto sincronizado y entrará en suspensión durante 500 milisegundos. -
¿A qué estado irá el hilo al llamar al método
Cuando se llama a un métodoyield()
?yield()
, el hilo actual "salta su turno" y Java inmediatamente cambia a ejecutar el siguiente hilo. El hilo va de estadorunning
en estadoready
. Los estados en ejecución y listo son subestados del estado RUNNABLE.
GO TO FULL VERSION