java.lang.IllegalMonitorStateException: object not locked by thread before notify()

newbie2009

Bekanntes Mitglied
Hey Leute habe mal eine Frage.
Ich versuche mit threads zu arbeiten aber bekomme immer die folgende Fehlermeldung, obwohl ich eigentlich den einen Thread mitm lock belege:
Code:
java.lang.IllegalMonitorStateException: object not locked by thread before notify()

Java:
private static Object lock = new Object();
// meine main 


		Thread t1 = new Thread(new Runnable() {
			public void run() {
				proceed();

			}
		});

		Thread t2 = new Thread(new Runnable() {
			public void run() {

				ladeBalken();
			}
		});

		t2.start();
		t1.start();
 }


// Methoden 


public static void proceed() {
		synchronized (lock) {

			try {
				System.out.println("vorfahrt gewähren");
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();

			}
			kHandler.post(new Runnable() {

				@Override
				public void run() {

					System.out.println("verarbeite nun die PDf");
					pdfReaderActivity.lokalOperation();

					lock.notify();

				}
			});

		}
	}

	public static void ladeBalken() {
		synchronized (lock) {

			try {

		
				System.out.println("ladeBalken gestartet");
				System.out.println("ladeBalken legt sich schlafen");

		

			System.out.print("schließe Fenster");
					lock.wait();
				

			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

Laut Meldung tritt der Fehler immer auf, sobald die Methode notify() aufgerufen wird. Was mache ich verkehrt????:L

mfg newbie
 
notify() kann nur auf Objekten aufgerufen werden, deren Lock vom aktuellen Thread gehalten wird. Es reicht nicht, das irgendein Thread dieses Lock besitzt (bzw besessen hat).

Also angenommen:

Java:
kHandler.post(new Runnable() {
 
                @Override
                public void run() {
 
                    System.out.println("verarbeite nun die PDf");
                    pdfReaderActivity.lokalOperation();
 
                    lock.notify();
 
                }
            });

startet einen NEUEN Thread, der die Runnable ausführt, dann besitzt dieser Thread zum Zeitpunkt des Aufrufs von notify() nicht den Monitor von lock und fällt deshalb auf die Schnauze.

Edit: Erläuterungen um zweiten Abschnitt ergänzt.
 
Zuletzt bearbeitet:
notify() kann nur auf Objekten aufgerufen werden, deren Lock vom aktuellen Thread gehalten wird. Es reicht nicht, das irgendein Thread dieses Lock besitzt (bzw besessen hat).

Also angenommen:

Java:
kHandler.post(new Runnable() {
 
                @Override
                public void run() {
 
                    System.out.println("verarbeite nun die PDf");
                    pdfReaderActivity.lokalOperation();
 
                    lock.notify();
 
                }
            });

startet einen NEUEN Thread, der die Runnable ausführt, dann besitzt dieser Thread zum Zeitpunkt des Aufrufs von notify() nicht den Monitor von lock und fällt deshalb auf die Schnauze.

Edit: Erläuterungen um zweiten Abschnitt ergänzt.

Ok klingt so weit logisch und wie löse ich das am besten? Muss ich auch im neuen Thread wieder mit synchronized arbeiten?🙂

Ok scheint zu funktionieren, danke für den Hinweis.
 
Zuletzt bearbeitet:

Zurück
Oben