Gå til innhold

Lock og condition: IllegalMonitorStateException


Anbefalte innlegg

Skrevet (endret)

Jobber med et lite chat-program og har støtt på et problem i Client-klassen. Jeg har én tråd for å lytte til input og en annen for output. Input-tråden fungerer fint. Det jeg prøver å få til med output-tråden, er at når metoden send(String message) blir kalt, så signaliserer den til en Condition jeg har inni en evig loop i output-tråden, og dermed outputes meldingen. Så kjører den loopen på nytt, støter på en await(), og må igjen vente på at metoden send() blir kalt for å signalisere. Problemet er som så at jeg får en IllegalMonitorStateException?

 

https://gist.github.com/anonymous/ec5c2c6a44e69b74ac8d

Endret av banansplitt™
Videoannonse
Annonse
Skrevet

Etter å ha tenkt meg litt om er det vel en total bom å bruke locks og conditions til noe sånt. Finnes det en form for Buffer eller noe jeg bare kan putte nye meldinger inn i sånn at loopen kjører videre når det har kommet nye meldinger i Buffer?

Skrevet (endret)

Du driver med socket programmering? 

 

En socket har en output stream og en input stream. Bruk BufferReader og BufferWrriter som stream objektene.

Bruk BufferedReader sin readLine() funksjon for å sjekke om det er mer input å lese.

Bruk BrufferWriter write og så flush for å sikre at de blir sendt. 

 

Hvis du skal oppdatere grafiske komponenter bruk

 SwingUtilities.InvokeLater(---)

Jeg villa ha sjekket om dety er faktisk meldinger å legge til og sørge for a GUI tråden kan oppdatere om dette er nødvendig

while (true) {
		try {
		     app.addMessage(input.readUTF(), input.readUTF());
		} catch (IOException e) {
		  e.printStackTrace();
		}

Husk å flush streamen din!

while (true) {
		noNewMessage.await();
		output.writeUTF(message);
	    }

Lykke til :)

Endret av Joachim Hansen
Skrevet (endret)

Slik?

Socket socket = new Socket(HOST, PORT);
DataInputStream inputStream = new DataInputStream(socket.getInputStream());
BufferedReader inputReader = new BufferedReader(new InputStreamReader(inputStream));

Får ikke noe ut av den ved å bruke inputReader.readLine();

 

EDIT: Løste seg. Tusen takk :)

Endret av banansplitt™

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...