Thread.State BLOCKED vs WAITING

5

Qual è la differenza tra gli stati BLOCCATI e ATTESA di un thread.

Come da commenti sul codice JAVA

    /**
     * Thread state for a thread blocked waiting for a monitor lock.
     * A thread in the blocked state is waiting for a monitor lock
     * to enter a synchronized block/method or
     * reenter a synchronized block/method after calling
     * {@link Object#wait() Object.wait}.
     */
    BLOCKED,

    /**
     * Thread state for a waiting thread.
     * A thread is in the waiting state due to calling one of the
     * following methods:
     * <ul>
     *   <li>{@link Object#wait() Object.wait} with no timeout</li>
     *   <li>{@link #join() Thread.join} with no timeout</li>
     *   <li>{@link LockSupport#park() LockSupport.park}</li>
     * </ul>
     *
     * <p>A thread in the waiting state is waiting for another thread to
     * perform a particular action.
     *
     * For example, a thread that has called <tt>Object.wait()</tt>
     * on an object is waiting for another thread to call
     * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
     * that object. A thread that has called <tt>Thread.join()</tt>
     * is waiting for a specified thread to terminate.
     */
    WAITING,

Non significa che entrambi gli stati sono simili in termini di attesa di blocco?

    
posta Free Coder 07.09.2015 - 19:50
fonte

1 risposta

8

Penso che i commenti che hai postato danno la risposta. Sono simili in quanto un thread è in attesa di un altro thread. Ma non sono uguali.

Lo stato BLOCKED significa attendere il monitor di un oggetto. Ciò accade spesso quando viene utilizzato un metodo o un'istruzione sincronizzati. Il thread è in attesa di accesso al codice sincronizzato o di eseguire qualsiasi altra azione che richiede il possesso del monitor dell'oggetto. Questo tipo di blocco si verifica spesso quando non ci sono tentativi e coordinate tra thread, ma ci sono due o più thread che chiamano i metodi o le istruzioni sincronizzati di un oggetto.

WAITING significa attendere un'azione specifica, ad es. a Notifica, o usando join () per attendere la conclusione di un thread. Questo tipo di attesa sembra indicare un tentativo di coordinamento tra i thread, in cui un thread ne notifica un altro o attende che ne completi un altro.

Un fattore potenzialmente fuorviante è che chiamare Object.wait () richiede il possesso del monitor dell'oggetto, per iniziare ad aspettare. Ma Object.wait () rilascia quindi il monitor fino alla notifica. Quindi un thread potrebbe passare dallo stato BLOCCATO allo stato ATTESA mentre ottiene il monitor, quindi esegue Object.wait () e inizia ad attendere. Vedi Doc: Java 7 Object.wait () .

I documenti Java 7 sembrano confermare questa interpretazione ...

A thread state. A thread can be in one of the following states:

NEW A thread that has not yet started is in this state.

RUNNABLE A thread executing in the Java virtual machine is in this state.

BLOCKED A thread that is blocked waiting for a monitor lock is in this state.

WAITING A thread that is waiting indefinitely for another thread to perform a particular action is in this state.

TIMED_WAITING A thread that is waiting for another thread to perform an action for up to a specified waiting time is in this state.

TERMINATED A thread that has exited is in this state.

A thread can be in only one state at a given point in time. These states are virtual machine states which do not reflect any operating system thread states.

Thread 7 Java Documenti.Stato

    
risposta data 07.09.2015 - 20:47
fonte

Leggi altre domande sui tag