Thread.State BLOCKED vs WAITING

5

Qual é a diferença entre os estados BLOCKED e WAITING de um thread.

De acordo com os comentários do código 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,

Isso não significa que ambos os estados são semelhantes em termos de espera por bloqueio?

    
por Free Coder 07.09.2015 / 19:50
fonte

1 resposta

8

Acho que os comentários que você postou dão a resposta. Eles são semelhantes em que um segmento está aguardando outro segmento. Mas eles não são os mesmos.

O estado BLOQUEADO significa aguardar pelo monitor de um objeto. Isso geralmente acontece quando um método ou uma instrução sincronizada é usada. O encadeamento está aguardando o acesso ao código sincronizado ou para executar qualquer outra ação que exija a propriedade do monitor do objeto. Esse tipo de bloqueio geralmente acontece quando não há tentativa e coordenação entre os threads, mas há dois ou mais threads chamando os métodos ou instruções sincronizados de um objeto.

ESPERA significa esperar por uma ação específica, por exemplo um Notify, ou usando join () para aguardar o término de um thread. Esse tipo de espera parece indicar alguma tentativa de coordenação entre os encadeamentos, onde um encadeamento notifica o outro ou espera que outro o conclua.

Um fator potencialmente confuso é que chamar Object.wait () requer possuir o monitor do objeto, para começar a esperar. Mas Object.wait () então libera o monitor até ser notificado. Assim, um thread pode passar pelo estado BLOCKED até WAITING enquanto obtém o monitor, depois executa Object.wait () e começa a esperar. Consulte o documento: Java 7 Object.wait () .

O Java 7 Docs parece confirmar essa interpretação ...

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.State do Java 7 Docs

    
por 07.09.2015 / 20:47
fonte