hallo,
ich muss von einem anderen Thread (als den AWT-Thread) aus ein JFrame abschießen. Dazu habe ich folgendes geschrieben:
Das funktioniert auch ganz gut. Ich weiß jedoch, dass es nicht die eleganteste Weise ist, einen Thread in einer while mit Object.wait(long timeout); warten zu lassen bis die Bedingung erfüllt ist.
Ich hab versucht statt waiter.wait(long timeout); einfach waiter.wait(); zu verwenden und dann in der Runnable nach dem schließen des Fensters waiter.notify(); aufzurufen. Dann krieg ich folgende Exception:
java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at fl.client.gfx.util.Destroyer$1.run(Destroyer.java:23)
Ich hab keine Ahnung warum. Kann mir jemand sagen, was ich da tun kann und mir nochmal genauer erklären:
Warum dieser Fehler entsteht?
Was eigentlich dieser Block synchronized da tut? (Ich weis, dass er dahin muss, aber genau hab ich keine Ahnung was synchronized Methods etc. eigentlich sind.)
Warum das mit dem waiter.wait(long timeout) nicht so ne gute Variante ist. Immerhin tut er dasselbe und rechnet auch nicht wirklich viel mehr, oder?
vielen Dank im Vorraus,
Fellkneul
ich muss von einem anderen Thread (als den AWT-Thread) aus ein JFrame abschießen. Dazu habe ich folgendes geschrieben:
Java:
package fl.client.gfx.util;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class Destroyer
{
private static boolean isDestroyed;
public static void destroy(final JFrame frame)
{
isDestroyed = false;
Runnable disposeFrame = new Runnable()
{
@Override
public void run()
{
frame.dispose();
isDestroyed = true;
}
};
SwingUtilities.invokeLater(disposeFrame);
Object waiter = new Object();
synchronized(waiter)
{
while(!isDestroyed)
{
try
{
waiter.wait(10);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}
Das funktioniert auch ganz gut. Ich weiß jedoch, dass es nicht die eleganteste Weise ist, einen Thread in einer while mit Object.wait(long timeout); warten zu lassen bis die Bedingung erfüllt ist.
Ich hab versucht statt waiter.wait(long timeout); einfach waiter.wait(); zu verwenden und dann in der Runnable nach dem schließen des Fensters waiter.notify(); aufzurufen. Dann krieg ich folgende Exception:
java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at fl.client.gfx.util.Destroyer$1.run(Destroyer.java:23)
Java:
package fl.client.gfx.util;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class Destroyer
{
private static boolean isDestroyed;
public static void destroy(final JFrame frame)
{
final Object waiter = new Object();
isDestroyed = false;
Runnable disposeFrame = new Runnable()
{
@Override
public void run()
{
frame.dispose();
isDestroyed = true;
waiter.notify();
}
};
SwingUtilities.invokeLater(disposeFrame);
synchronized(waiter)
{
while(!isDestroyed)
{
try
{
waiter.wait();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}
Ich hab keine Ahnung warum. Kann mir jemand sagen, was ich da tun kann und mir nochmal genauer erklären:
Warum dieser Fehler entsteht?
Was eigentlich dieser Block synchronized da tut? (Ich weis, dass er dahin muss, aber genau hab ich keine Ahnung was synchronized Methods etc. eigentlich sind.)
Warum das mit dem waiter.wait(long timeout) nicht so ne gute Variante ist. Immerhin tut er dasselbe und rechnet auch nicht wirklich viel mehr, oder?
vielen Dank im Vorraus,
Fellkneul