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:
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.
greetz KN4CK3R
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