Threads wait() und notify()

KN4CK3R

Mitglied
Hallo,

ich habe mehrere Threads von denen jeder für seinen Nachfolger die Vorarbeit erledigt, woraufhin dieser mit seiner Arbeit weitermachen kann.
Jeder Thread besitzt eine Variable position auf die sein Nachfolger zugreifen kann. Jeder Thread bearbeitet ein Array und setzt position auf die Stelle, die er gerade bearbeitet. Der nachfolgende Thread muss mit seiner Arbeit solange warten bis parent.getPosition() - this.position > 2 ist.
Dazu hatte ich bisher folgenden Code:

Java:
while (parent.getPosition() - position < 2) {
    Thread.sleep(1);
}

Nun wollte ich das ganze aber nicht mit dem (meiner Meinung nach) unschönen Thread.sleep lösen, sondern mit einem Lock-Object, das ich per wait und notify synchronisieren wollte. Jeder Thread hat nun noch ein Object lock;, auf das der Nachfolger Zugriff hat. Nun hab ich aber das Problem, dass ich nicht weiß, wie ich das ganze nun benutzen soll, da mir bisher jeder Versuch eine IllegalMonitorStateException eingebracht hat.

Java:
void run() {
	Object parentLock = parent.getLockObject(); // ist das Object lock des Vorgängers (siehe Zeile 4)
	for (int i = 0; i < arrayWidth; ++i) {
		synchronized (lock) {
			while (parent.getPosition() - position < 2) {
				synchronized (parentLock) {
					wait();
				}
			}
			
			//do work
			
			notify();
		}
	}
}

greetz KN4CK3R
 

tfa

Top Contributor
Kleiner allgemeiner Tipp: Vergiss wait() und notify() am besten völlig, und wenn möglich synchronized noch dazu. Schau dir stattdessen das Concurrency-Framework an. Das ist sehr viel schöner, einfacher und sicherer als diese Low-Level-Synchronisation. Hier könnte man vielleicht mit Locks und Conditions arbeiten.
 

KN4CK3R

Mitglied
hab mir das mal angeschaut und in meinem Fall wäre das wohl das richtige. Damit hätte ich doch aber immernoch das Problem, dass alles in einem lock.(un)lock(); gefangen wäre (vgl. meinem synchronized Block im Code oben) oder nicht?

greetz KN4CK3R
 

Volvagia

Top Contributor
Was spricht gegen wait/notify? Ist doch einfach eigendlich sehr einfach.

Java:
import java.awt.EventQueue;
import java.util.concurrent.TimeUnit;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Lock
{
	private static final Object LOCK = new Object();
	
	public static void main(String[] args)
	{
		EventQueue.invokeLater(new Runnable() {
			public void run()
			{
				JFrame frame = new JFrame();
				frame.add(new JLabel("Frame zum Beenden, Ausgabe -> Konsole"));
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.pack();
				frame.setLocationRelativeTo(null);
				frame.setVisible(true);
			}
		});
		
		new Thread() {
			public void run()
			{
				System.out.println("Thread A startet");
				
				do
				{
					System.out.println("Thread A wartet 4 Sekunden.");
					doSleeping(TimeUnit.SECONDS, 4L);
					
					System.out.println("Thread A weckt B auf.");
					doNotify();
				}
				while(true);
			}
		}.start();
		
		new Thread() {
			public void run()
			{
				System.out.println("Thread B startet");
				
				do
				{
					System.out.println("Thread B wartet auf A");
					doWaiting();
					System.out.println("Thread B wurde aufgeweckt und fährt nun fort.");
				}
				while(true);
			}
		}.start();
	}

	private static void doWaiting()
	{
		synchronized (LOCK)
		{
			try
			{
				LOCK.wait();
			}
			catch (InterruptedException e) {}
		}
	}
	private static void doNotify()
	{
		synchronized (LOCK)
		{
			LOCK.notifyAll();
		}
	}
	private static void doSleeping(TimeUnit timeUnit, long timeFactor)
	{
		try
		{
			timeUnit.sleep(timeFactor);
		}
		catch (InterruptedException e) {}
	}
}
 

Suinos

Bekanntes Mitglied
KN4CK3R hat gesagt.:
das notify steckt schon in einem synchronized (siehe Zeile 4)
Du müsstest die Methoden aber auf den synchronisierten Objekten aufrufen:
Java:
Object lock = getLock();

synchronized (lock)
{
    lock.wait();
}
Momentan rufst du aber die Methoden auf dem 'umfassenden' Objekt auf.
 

KN4CK3R

Mitglied
@Volvagia: sieht sehr brauchbar aus, werde ich auf jeden Fall mal testen.
@Suinos: ich dachte innerhalb einem synchronized(obj) ist this = obj?

greetz KN4CK3R
 

Murray

Top Contributor
ich dachte innerhalb einem synchronized(obj) ist this = obj?
Nein, das ist nicht der Fall.
synchronized bei der Deklaration einer (Instanz-)Methode hat zwar den gleichen Effekt wie ein synchronized( this)-Block um den gesamten Methodenkörper; das bedeutet aber nicht, dass durch einen synchronized-Block die Bedeutung von this geändert würde.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
mrbig2017 Threads wait wird nicht durch notify beendet! Allgemeine Java-Themen 3
G Threads Threadprogrammierung wait() und notify() Allgemeine Java-Themen 4
T Wait/Notify() bei Thread Allgemeine Java-Themen 6
B Threads Barrier mit wait()/notify() aber nicht alle Prozesse terminieren Allgemeine Java-Themen 2
P Threads abwechseln lassen mit wait() und notify() Allgemeine Java-Themen 2
M Java Threads - Wait Notify - Verständnisproblem Allgemeine Java-Themen 5
Q Frage zu Threads ( notify() wait() ) Allgemeine Java-Themen 6
G Thread wait, notify Allgemeine Java-Themen 4
H wait() and notify() mit mehreren Prozessen Allgemeine Java-Themen 14
A thread1 stoppt thread2 mit wait() und notify() ? Allgemeine Java-Themen 3
K Multithreading: Service(Task), wait und continue Allgemeine Java-Themen 21
J Thread wait() Allgemeine Java-Themen 2
J Swing Cursor.WAIT funktioniert nicht nach JFileChooser Allgemeine Java-Themen 1
A System freezes when trying to run external command from Java with wait for Allgemeine Java-Themen 3
T Threadsicheres wait() [lock erst mit wait() abgeben] Allgemeine Java-Themen 31
J synchronized block mit this und wait() Allgemeine Java-Themen 5
G Process.wait() auf Folgeprozesse mitwarten Allgemeine Java-Themen 29
G Thread wait() auf Nicht-Thread Klasse Allgemeine Java-Themen 5
M Thread mit wait anhalten, wie weiterlaufenlassen? Allgemeine Java-Themen 3
M wait in Thread einschieben? Allgemeine Java-Themen 4
C p.wait() bremst aus Allgemeine Java-Themen 4
N java.lang.IllegalMonitorStateException: object not locked by thread before notify() Allgemeine Java-Themen 2
B notify() - was passiert danach genau? Allgemeine Java-Themen 8
L Producer/Consumer Thread mit notify auf File Allgemeine Java-Themen 5
G notify() was wird verständigt Allgemeine Java-Themen 5
K synchronized und notify / notifyAll Allgemeine Java-Themen 8
G MVC-Konzept - effizienz beim "notify" Allgemeine Java-Themen 2
M Unterschied notify() und notifyAll() Allgemeine Java-Themen 1
S Unterschied zwischen notify() und notifyAll() Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben