object.notify () no despierta object.wait ()

Estoy intentando usuario ' synchronized(object) {object.wait()}' para pausar mi servidor hasta que el objeto esté listo. Y he llamado ' synchronized(object) {object.notify() }' en la clase que establecerá el valor del objeto. Pero parece que mi servidor nunca se despierta después wait().

public class MyServer {
...
do {
            try {

                message = (String) in.readObject();
                System.out.println("server receive>" + message);

                synchronized (myServerSend) {
                    myServerSend.wait();
                }

                System.out.println("Am I wake up???"); //this never print out

                sendMessage(myServerSend);

            } catch (ClassNotFoundException classnot) {
                System.err.println("Data received in unknown format");
            }
        } while (!message.equals("bye"));

    } catch (IOException ioException) {
        ioException.printStackTrace();
    }
....
}

Aquí están mis llamadas para establecer el valor del objeto

public class Action implements MouseInputListener, MouseMotionListener {

    ....

    public void mouseClicked(MouseEvent e) {


        if (SwingUtilities.isLeftMouseButton(e)) {...
    }

        else {
            ....
            if(MyGame.currentPlayer == MyGame.WHITE) {
                    myServerSend = "" + chosenPieceIndex + "," + moveLocationIndex;
                    synchronized (myServerSend) {

                        myServerSend.notify(); // this seems like fail to wake up myServer

                    }
                    System.out.println(myServerSend);
}

¿Será un problema si declaro myServerSend como un tipo de cadena estática pública? ¿Alguien podría ayudar con eso? ¡Gracias por adelantado!

Respuesta 1

Tal vez llegaste al código de notificación antes de la espera. Siempre debe poner thread.wait () dentro del bucle while por ese motivo (y también debido a un espurio despertar, pero por este motivo hacer while es lo suficientemente bueno).

Respuesta: 2

Si bien no estoy seguro de qué es exactamente lo que está mal con su código tal como está escrito, el código es inherentemente inseguro. Si nada más, no hay garantía de que la llamada se wait()realice antes notify(): si la notificación ocurre primero, la espera durará para siempre. Además, la espera puede despertarse espuriamente , por lo que incluso si arregla eso, aún no tendrá el código correcto:

Un subproceso también puede despertarse sin ser notificado, interrumpido o expirado, lo que se conoce como un despertar espurio. Si bien esto rara vez ocurrirá en la práctica, las aplicaciones deben protegerse contra él probando la condición que debería haber provocado que el hilo se haya despertado y continuando esperando si la condición no se cumple. En otras palabras, las esperas siempre deben ocurrir en bucles, como este:

 synchronized (obj) {
     while (<condition does not hold>)
         obj.wait(timeout);
     ... // Perform action appropriate to condition
 }

Puede considerar reemplazar este código con un CountDownLatch , un CyclicBarrier o incluso un semáforo . Estas clases son mucho más fáciles y menos propensas a errores de uso. wait/ notifyson de nivel inferior y algo más difíciles de usar correctamente.

Respuesta: 3

Recientemente enfrenté problemas al construir mi proyecto debido al error "HTTPS requerido". Este problema se resolvió modificando mi pom.xml como se describe aquí, agregando lo siguiente: <pluginRepositories> ...

Estoy cansado de implementar el controlador Phantomjs para las pruebas de Selenium, pero me arroja este error. java.lang.NoSuchMethodError: org.openqa.selenium.os.CommandLine.find (Ljava / lang / String;) Ljava / lang / String; Los ...

He intentado buscar en Google por un tiempo y no pude encontrar nada, pero me disculpo si esto es realmente obvio. Tengo una matriz booleana que siempre tiene una longitud de 8 y quiero insertar el valor binario correspondiente ...

Necesito capturar dos grupos de una cadena de entrada. Los valores difieren en la estructura a medida que entran. Los siguientes son ejemplos de las cadenas entrantes: Comentario = "Esto es un comentario"; NumericValue = ...