class Test {
public static void main(String[] args) {
System.out.println("1.. ");
synchronized (args) {
System.out.println("2..");
try {
Thread.currentThread().wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("3..");
}
}
}
estoy obteniendo IllegalMonitorStateException
excepción de monitor en este código. Según mi entendimiento, debido al bloqueo sincronizado alrededor args
que es el objeto de matriz de cadena, el subproceso actual debe haber adquirido el bloqueo y con el método de espera, libero el bloqueo.
¿Puede alguien explicarme la razón detrás de esta excepción?
Respuestas
4 para la respuesta № 1Estas llamando wait()
en Thread.currentThread()
. Antes de llamar wait()
En cualquier objeto, debes poseer el monitor. de este objeto, a modo de sincronización sincronizada de bloques. en este objeto. Entonces, lo que falta es
synchronized(Thread.currentThread()) {
Thread.currentThread().wait();
}
Dicho esto, llamando wait()
en un objeto Thread no es algo que debas hacer, y probablemente demuestre que no has entendido lo que wait()
Sí, especialmente porque no tienes ningún otro subproceso de llamada. notify()
o notifyAll()
. Sincronizar en los argumentos pasados al método principal también es una opción muy extraña. wait()
es un método de muy bajo nivel que rara vez se debe utilizar, incluso si comprende completamente lo que hace. Para una mejor respuesta, debe explicar lo que realmente quiere que haga este código.
3 para la respuesta № 2
De IllegalMonitorStateException
documentación
Se lanza para indicar que un subproceso ha intentado esperar en el monitor de un objeto o para notificar a otros subprocesos que esperan en el monitor de un objeto sin poseer el monitor especificado
De Object#notify()
documentación
Un hilo se convierte en el propietario del monitor del objeto de una de estas tres formas:
- Ejecutando un método de instancia sincronizada de ese objeto.
- Ejecutando el cuerpo de una instrucción sincronizada que se sincroniza en el objeto.
- Para objetos de tipo Clase, ejecutando un método estático sincronizado de esa clase.
Así que ya que el hilo está ejecutando bloque sincronizado en args
objeto
synchronized (args) {
//...
}
deberías llamar args.wait()
en lugar Thread.currentThread().wait();
.
0 para la respuesta № 3
Hola, ankit, asumo que estás tratando de aprender algunos conceptos básicos de multihilo. tratar de conseguir algunos buenos tutoriales en línea:http://www.javaworld.com/jw-04-1996/jw-04-threads.html
o prueba algún buen libro básico. http://www.amazon.com/SCJP-Certified-Programmer-Java-310-065/dp/0071591060/
El programa que escribiste en realidad no necesitasincronización ya que solo hay un hilo (principal). Sé que solo estás probando tus manos, por lo tanto, estás dando algunas ideas. Incluso si ha llamado correctamente al método de espera en args (args.wait ()) o sincronizado en Thread.currentThread, su hilo puede tener una espera indefinida (haciendo que su programa no responda) porque no hay otro hilo para notificar a su hilo principal.