Technaton
23-08-2005, 19:08
Grüße euch!
Ich hab da ein kleines Problem, den Einsatz von .wait() bzw. notify() in Verbindung mit sychronized() zu verstehen.
Folgende beiden Klassen:
public class SomeWriter extends Thread
{
public String name = "";
public SomeWriter instance = new SomeWriter();
/* ... ne menge Zeugs ... */
public void run()
{
/* Tut Dinge, liest von Sockets, usw */
synchronized(name) {
name = zipentry.getName();
name.notify();
}
}
}
public class SomeReader extends Thread
{
String s;
public void run()
{
while(!interrupted()) {
synchronized(instanceOfSomeWriter.name) {
try {
instanceOfSomeWriter.name.wait();
s = instanceOfSomeWriter.name;
} catch (Exception e) { /* Exceptionhandling */ }
}
}
}
}
Gedacht ist, daß "SomeWriter" in unregelmäßigen Abständen einen Dateinamen in der Variable "name" ablegt. Wenn das getan ist, soll per "notify()" der wartende "SomeReader" benachrichtigt werden, der die Variable ausliest (und irgendwas damit tut), um dann wieder zurückzukehren und zu warten, bis erneut "notify()" aufgerufen wird. Soweit die Theorie. In der Praxis allerdings erhalte ich an der Stelle, an der ich notify(); aufrufe, eine IllegalMonitorStateException -- warum? Die einzigen Threads, die auf die Variable zugreifen, sind die aus "SomeReader" und "SomeWriter", und wenn die APIs nicht lügen, löst wait(); die Sperrung auf das Objekt -- also sollte der Monitor in dem Moment, in dem ich notify(); aufrufe, auch dem entsprechenden Thread gehören, oder?
Ich danke demjenigen, der mich dem Verständnis näher bringt. :)
Gruß,
Techl
Ich hab da ein kleines Problem, den Einsatz von .wait() bzw. notify() in Verbindung mit sychronized() zu verstehen.
Folgende beiden Klassen:
public class SomeWriter extends Thread
{
public String name = "";
public SomeWriter instance = new SomeWriter();
/* ... ne menge Zeugs ... */
public void run()
{
/* Tut Dinge, liest von Sockets, usw */
synchronized(name) {
name = zipentry.getName();
name.notify();
}
}
}
public class SomeReader extends Thread
{
String s;
public void run()
{
while(!interrupted()) {
synchronized(instanceOfSomeWriter.name) {
try {
instanceOfSomeWriter.name.wait();
s = instanceOfSomeWriter.name;
} catch (Exception e) { /* Exceptionhandling */ }
}
}
}
}
Gedacht ist, daß "SomeWriter" in unregelmäßigen Abständen einen Dateinamen in der Variable "name" ablegt. Wenn das getan ist, soll per "notify()" der wartende "SomeReader" benachrichtigt werden, der die Variable ausliest (und irgendwas damit tut), um dann wieder zurückzukehren und zu warten, bis erneut "notify()" aufgerufen wird. Soweit die Theorie. In der Praxis allerdings erhalte ich an der Stelle, an der ich notify(); aufrufe, eine IllegalMonitorStateException -- warum? Die einzigen Threads, die auf die Variable zugreifen, sind die aus "SomeReader" und "SomeWriter", und wenn die APIs nicht lügen, löst wait(); die Sperrung auf das Objekt -- also sollte der Monitor in dem Moment, in dem ich notify(); aufrufe, auch dem entsprechenden Thread gehören, oder?
Ich danke demjenigen, der mich dem Verständnis näher bringt. :)
Gruß,
Techl