Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Wie lässt man eine Methode warten ohne Threads zu benutzen?
Oder geht das nicht?
Eigentlich möchte ich nämlich keine Threads benutzen(aus Versagensängsten*g*)
Ich habe eine Methode, die aufgerufen wird ) . Sie muss dann etwas über eine serielle Schnittstelle senden.
Kurze Zeit später kommen Daten über die Schnittstelle zurück. Diese werden durch einen Listener(implements SerialPortEventListener) empfangen. Der merkt auch, wenn er fertig ist, könnte dann also ne boolsche Variable umsetzen oder so.
Die Methode soll dann anschließend die empfangenen Daten verarbeiten.
Aber wie lasse ich sie darauf warten, dass die Daten ankommen?
Ich habs versucht, aber ich bekomme folgende fehlermeldung einfach nicht weg:
java.lang.IllegalMonitorStateException: current thread not owner
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:426)
at kukacomm.touchup(kukacomm.java:78)
at test2$4.actionPerformed(test2.java:131)
at java.awt.Button.processActionEvent(Button.java:381)
at java.awt.Button.processEvent(Button.java:350)
at java.awt.Component.dispatchEventImpl(Component.java:3639)
at java.awt.Component.dispatchEvent(Component.java:3480)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:450)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThr
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThrea
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:144)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:136)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:99)
leider habe ich keine ahnung, wie man einen thread zum owner macht, irgendwie habe das gefühl,dass das problem hier wegen der statischen methode auftritt. ich poste mal nen codeauszug, das problem tritt auch ohne notify, also beim wait auf:
}
catch(InterruptedException e) {};
String[] result = new String[]{};
for (int i = 0; i < Array.getLength(parameter); i++)
result = parameter.toString();
return result;
}
.........
public static class commListener implements SerialPortEventListener{
public synchronized void serialEvent(SerialPortEvent event1) {
if(event1.getEventType()==SerialPortEvent.DATA_AVAILABLE){
byte[] readBuffer = new byte[4];
try {
//der Inputstream ins wird ueber den readBuffer in den String nachricht uebergeben
while (ins.available() > 0) {int numBytes = ins.read(readBuffer);}
String nachricht = new String(readBuffer);
System.out.println(nachricht);
if(touchingup = true) {
stringbuffer.append(nachricht);
tokenizer = new StringTokenizer(stringbuffer.toString(), " ");
System.out.println(tokenizer.countTokens());
//System.out.println(nachricht);
if ( (tokenizer.countTokens() == 7) ) {
touchingup = false;
for (int i = 1; i < 7; i++) {
String temp = tokenizer.nextToken();
for (int j = 0; j < temp.length(); j++) {
if (Character.isWhitespace(temp.charAt(j))==false) parameter.append(temp);
}
}
//m_monitor.notify();
}
}
// ausgabe.append(nachricht); //nachricht wird anschließend gelöscht
hmm, der fehler kommt nur, wenn man notify aufruft, ohne selbst den lock gesetzt zu haben, bzw wenn kein lock gesezt ist. ah ja, der monitor muss synchronized sein. kopiere dir die klasse mal und trace durch, vieleicht wird dadurch die sache etwas verstaendlicher
habs mir jetzt den quelltext nicht durchgelesen, aber theoretisch brauchste nur ne endlosschleife in der du zb ne zählschleife einbaust (nur um zeit zu schinden, da du ja kein thread.sleep(x) verwenden willst) und jedesmal wird halt diese variable abgefragt zb so:
Ich kann dir von der Schleifenlösung nur abraten, das verbraucht die Kompletten Resourcen. Da solltest du auf jeden Fall Thread.sleep() verwenden. Dabei muss man ja nicht wirklich mit Threads hantieren.
wie oben richtig angesprochen arbeitet jedes Java Programm mit mindestens einem Thread (wobei der gc und andere dazukommen).
Nach dem Start gibt es einen Main-Thread, der das Programm abarbeitet und der lässt sich natürlich auch anhalten.
Da sowieso alles schon geschrieben wurde geb ich nur nochmal den kompletten Code.
([Zeit] ist dabei die Zeit in Millisekunden, die das Programm anhalten soll.)