Wie lässt man eine Methode warten ohne Threads zu benutzen?

Status
Nicht offen für weitere Antworten.
M

Moe

Gast
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 wäre über Hilfe sehr dankbar.
 

mariopetr

Bekanntes Mitglied
naja, dh du sowieso schon threads benutzt (tut nun mal jedes javaprogramm)

versuche es mal mit

class Foo implements Listener
{
private final Object m_monitor=new Object();

public void do()
{
sendData();
m_monitor.wait();
resolveData();
}

public void onAction()
{
m_monitor.notify();
}
}

die try-catch-statements fehlen noch
 
M

Moe

Gast
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:

public class kukacomm{

static CommPortIdentifier portID;
static OutputStream out;
static SerialPort serss;
........
static private Object m_monitor;



public static void main(String[] args) {

}

.........

public static synchronized String[] touchup() {

touchingup = true;
stringbuffer = new StringBuffer();
senden(5);
m_monitor=new Object();
try {

m_monitor.wait(); //warten

}
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

}
catch (IOException e) {System.out.println("Fehler: "+e);}


}


im letzten teil ist das notify auskommentiert, dennoch taucht der fehler auf.
 

mariopetr

Bekanntes Mitglied
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

Code:
public class Test01
{

	private final Object m_monitor=new Object();
	private String m_temp;
	
	public static void main(String[] args)
	{
		Test01 t=new Test01();
		t.touchup();	
	}

	public void touchup()
	{

		System.out.println("touchup");// //$NON-NLS-1$
		try
		{
			System.out.println("wait now");// //$NON-NLS-1$
			new EventTrigger(this); 
			synchronized(m_monitor) //wichtig
			{
				m_monitor.wait();
			}
			System.out.println("wait end");// //$NON-NLS-1$
			System.out.println("read: \n"+m_temp); 
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}		
	
	public void notifyEvent(String readData)
	{
		m_temp=readData;
		synchronized(m_monitor) //wichtig
		{
			m_monitor.notify();	
		}
	}
		
	static class EventTrigger extends Thread
	{		
		private Test01 m_object;
		
		public EventTrigger(Test01 aObject)
		{
			super("testThread");//  //$NON-NLS-1$
			setDaemon(true);
			setPriority(Thread.MIN_PRIORITY);
			m_object=aObject;
			start();
		}
		
		/* (non-Javadoc)
		 * @see java.lang.Thread#run()
		 */
		public void run()
		{
			try
			{
				System.out.println("Thread start");// //$NON-NLS-1$
				String tmp="";// //$NON-NLS-1$
				for (int i = 0; i<5; i++)
				{
					System.out.println("read something");// //$NON-NLS-1$
					tmp+="call #"+i+"\n";// //$NON-NLS-1$ //$NON-NLS-2$
					Thread.sleep(300);
				}
				m_object.notifyEvent(tmp);
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
		}
	}
}

warum funktionieren bei mir die codetags nicht richtig?
 

Nobody

Top Contributor
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:

Code:
while(fertig!=true){
  for(int i=0;i<10000;i++){}
}
//folgemethoden

das mit der zählschleife ist zwar nicht sehr elegant funzt aber
 

DTR

Bekanntes Mitglied
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.
 

bummerland

Top Contributor
die lösung mit der schleife sollte man auf gar keinen fall anwenden.

du machst einfach Thread.sleep(sekunden).
diese methode ist static, das heisst, du musst überhaupt nicht mit threads rumhantieren.
 

aquanox

Mitglied
Hi,

einfache Lösung:

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.)

try
{
Thread.sleep([Zeit]);
}
catch(InterruptedException e)
{
}


Das ganze lässt sich z.b. auch in eine while schleife packen um die boolean variable abzufragen:

while(!variable)
{
... schlafe für einige millisekunden...
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Warum lässt sich eine Klasse nicht starten, wenn eine andere Klasse in dem Modul fehlerhaft ist? Java Basics - Anfänger-Themen 1
P Probleme mit NetBeans: Wie lässt sich jar. Datei an einem MacBook öffnen Java Basics - Anfänger-Themen 21
F abbruch Exception lässt sich nicht erstellen Java Basics - Anfänger-Themen 2
G jar file lässt sich nicht öffnen Java Basics - Anfänger-Themen 1
J Mein Java Programm lässt sich nicht mehr bearbeiten Java Basics - Anfänger-Themen 2
I Probleme mit OutputStream - Datei lässt sich nicht öffnen Java Basics - Anfänger-Themen 4
H Liste speichern. Was lässt sich verbessern? Java Basics - Anfänger-Themen 7
Franzi1001 ScrollBar lässt sich nicht bewegen Java Basics - Anfänger-Themen 4
C Classpath Compiler lässt sich nur bedingt von Kommandozeile aus starten Java Basics - Anfänger-Themen 17
CptK Datentypen Objekt lässt sich nicht zu arraylist hinzufügen Java Basics - Anfänger-Themen 2
L Mein Taschenrechner lässt sich plötzlich nicht mehr öffnen Java Basics - Anfänger-Themen 5
P jar file lässt sich nicht ausführen Java Basics - Anfänger-Themen 4
L Programm lässt sich nicht starten! Java Basics - Anfänger-Themen 1
pkm Interface Funktionales Interface lässt sich nicht implementieren. Java Basics - Anfänger-Themen 2
x-tshainge Mein Programm lässt sich nicht Starten Java Basics - Anfänger-Themen 8
B Classpath Class lässt sich nicht öffnen Java Basics - Anfänger-Themen 3
E App lässt sich nicht starten Java Basics - Anfänger-Themen 8
E Pdf-Document lässt sich im Servlet nicht öffnen Java Basics - Anfänger-Themen 5
S Erste Schritte Java Applet lässt sich im Browser nicht öffnen Java Basics - Anfänger-Themen 9
X Streams und Ausgabe - lässt sich das einfacher schreiben oder schöner schreiben? Java Basics - Anfänger-Themen 5
J Java Datei lässt sich nicht kompilieren Java Basics - Anfänger-Themen 3
J Reihenfolge im Vector lässt sich nicht drehen Java Basics - Anfänger-Themen 9
J Wie lässt sich der Konstruktor einer Klasse einer Funktion einer Klasse nutzen. Java Basics - Anfänger-Themen 4
M Array mit Objekten lässt sich nicht auslesen Java Basics - Anfänger-Themen 10
T Scanner lässt sich nicht importieren Java Basics - Anfänger-Themen 1
P Programm lässt sich nicht starten - Klasse mit Hauptmethode nicht gefunden Java Basics - Anfänger-Themen 9
B Compiler-Fehler [Lejos] [RCX] Programm lässt sich nicht kompilieren Java Basics - Anfänger-Themen 5
N Von Kopf bis Fuss TestArrays lässt sich nicht lösen Java Basics - Anfänger-Themen 5
S Rückgabe-Array lässt sich nicht auslesen, LocalDate mit String Java Basics - Anfänger-Themen 3
G Java lässt sich nicht installieren Java Basics - Anfänger-Themen 1
L0MiN Datei lässt sich nicht ausführen Java Basics - Anfänger-Themen 3
A charAt(x)-Abfrage lässt bei Strings<x das Pgrogramm abstürzen. Kann man das verhindern? Java Basics - Anfänger-Themen 4
A Java-Zeilenprogramm lässt sich nicht exportieren Java Basics - Anfänger-Themen 13
J Klick auf Button -> JFrame öffnet sich erneut. & Datei lässt sich nicht löschen Java Basics - Anfänger-Themen 7
A Lässt sich dieser Ausdruck irgendwie einfacher schreiben? Java Basics - Anfänger-Themen 4
E jar lässt sich nicht ausführen Java Basics - Anfänger-Themen 16
V Compiler-Fehler Programm lässt sich nicht kompilieren Java Basics - Anfänger-Themen 22
S jar Datei lässt sich nur über CMD starten Java Basics - Anfänger-Themen 15
M Java Class File lässt sich nicht ausführen Java Basics - Anfänger-Themen 3
H Java Archiv lässt sich nur pfadgebunden öffnen? Java Basics - Anfänger-Themen 26
D Datentypen Abstrakter Datentyp lässt sich nicht casten Java Basics - Anfänger-Themen 7
B Methoden Methode lässt sich nicht selbst aufrufen? Java Basics - Anfänger-Themen 3
M Datei lässt sich nicht löschen Java Basics - Anfänger-Themen 17
M Variablen Variable lässt sich durch ActionListener nicht ändern Java Basics - Anfänger-Themen 5
Y .class Ausführung nicht möglich - Path lässt sich nicht ändern Java Basics - Anfänger-Themen 8
F Textfenster lässt sich nicht schließen Java Basics - Anfänger-Themen 3
J Classpath Programm lässt sich nicht ausführen Java Basics - Anfänger-Themen 5
H programm lässt sich nicht compilieren Java Basics - Anfänger-Themen 7
W [Java Archive (JAR) Datei erstellen] Lässt sich nicht ausfürhren Java Basics - Anfänger-Themen 7
M selbst gezipptes File lässt sich nicht öffnen Java Basics - Anfänger-Themen 2
U String lässt sich nicht in txt datei schreiben! Java Basics - Anfänger-Themen 7
R jLabel lässt sich nicht public setzen?? Java Basics - Anfänger-Themen 15
L Programm lässt sich nicht starten Java Basics - Anfänger-Themen 9
hdi File lässt sich nicht erstellen Java Basics - Anfänger-Themen 3
S (Anfänger) problem Programm lässt sich nicht öffnen! Java Basics - Anfänger-Themen 6
S Aufgabe gelöst, lässt sich aber nicht kompilieren Java Basics - Anfänger-Themen 3
S ArrayList länge lässt sich nicht voreinstellen Java Basics - Anfänger-Themen 10
Developer_X Wie lässt man ein Applet, in einem JFrame erscheinen? Java Basics - Anfänger-Themen 16
N Startklasse lässt sich nicht ausführen Java Basics - Anfänger-Themen 17
D Sehr großer String lässt sich nicht bearbeiten Java Basics - Anfänger-Themen 7
F jTextField lässt sich aus einer Unterklasse nicht ansprechen Java Basics - Anfänger-Themen 2
T TreeMap lässt sich nicht sortieren Java Basics - Anfänger-Themen 8
A Scrollen im Browser lässt Applet neu starten? Java Basics - Anfänger-Themen 14
G Generics - Map.putAll lässt sich nicht richtig implementiern Java Basics - Anfänger-Themen 6
U jarfile lässt sich nicht ausführen Java Basics - Anfänger-Themen 5
N jar lässt sich nicht öffnen Java Basics - Anfänger-Themen 7
G Fenster lässt sich nicht schließen. Java Basics - Anfänger-Themen 4
G Datei lässt sich nicht ändern Java Basics - Anfänger-Themen 12
S Hintergrundfarbe lässt sich nicht ändern Java Basics - Anfänger-Themen 3
M Textare lässt sich nicht ansprechen Java Basics - Anfänger-Themen 9
G button grösse lässt sich nicht verstellen Java Basics - Anfänger-Themen 9
G Programm lässt sich nicht aus der Konsole starten Java Basics - Anfänger-Themen 2
S Hintergrundfarbe lässt sich nicht ändern Java Basics - Anfänger-Themen 2
N jar Datei lässt sich nicht öffnen Java Basics - Anfänger-Themen 3
M Checkboxarray lässt sich nicht füllen Java Basics - Anfänger-Themen 8
R Image lässt sich nicht in ein Panel einfügen Java Basics - Anfänger-Themen 3
A in BufferdImage lässt sich nicht Zeichnen Java Basics - Anfänger-Themen 2
K package lässt sich nicht implementieren Java Basics - Anfänger-Themen 3
V public class lässt sich nicht erstellen Java Basics - Anfänger-Themen 2
G erzeugtes file lässt sich nicht löschen Java Basics - Anfänger-Themen 2
R Applet lässt sich nicht kompilieren Java Basics - Anfänger-Themen 4
R Ojekt lässt sich nicht speichern! Java Basics - Anfänger-Themen 9
Kerstininer Vererbung Hilfe beim lernen von Objektorientierung für eine Klausur Java Basics - Anfänger-Themen 10
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
I In unterschiedlichen Applikation Zugriff auf eine gemeinsame Anwendung? Java Basics - Anfänger-Themen 8
D 2 ArrayListen gleich sortieren bzw. eine Liste anhand einer anderen Sortieren Java Basics - Anfänger-Themen 6
T Ich brauche eine Schleife die eine beliebige Zahl so lange durch 10 teilt bis zur Null Java Basics - Anfänger-Themen 5
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
J Eine konzeptionelle Frage zu OOP Java Basics - Anfänger-Themen 3
N Ich kriege ganze zeit die Fehlermeldung "Inhalt der Zwischenablage kann nicht in die ausgewählten Elemente eingefügt werden" hat jemand eine Lösung? Java Basics - Anfänger-Themen 6
M Vergleichen, ob eine Liste länger als andere ist Java Basics - Anfänger-Themen 6
T Methode soll etwas ausrechnen und zurückgeben (klappt nd) hat wer eine Idee? Java Basics - Anfänger-Themen 11
Shadowrunner Variablen Gibt es eine Möglichkeit die Ziffern/Stellen einer Zahl fest zu legen? Java Basics - Anfänger-Themen 3
Kingdako Wie löse ich eine Mathematische Formel mit Arrays und Schleifen? Java Basics - Anfänger-Themen 32
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
G Wie wartet man bis ein URL eine Antwort zurückgibt? Java Basics - Anfänger-Themen 5
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
S 2 Reihen ratio-btn, eine Reihe funktioniert andere nicht Java Basics - Anfänger-Themen 4
T Eingabe durch eine Zahl dividieren nachgucken? Java Basics - Anfänger-Themen 4
M mit Maven eine ausführbare Jar bauen Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben