Auf Einträge im Buffer warten

Status
Nicht offen für weitere Antworten.

mephi

Bekanntes Mitglied
Hi,

um Aufgenommenes oder live Gesprochenes zu verarbeiten, habe ich ein Thread der die Daten in eine LinkedBlockingQueue schreibt und ein anderer Thread verarbeitet alles was da drin ist nach und nach. Mein Problem besteht jetzt darin, wie ich das ganze sinnvoll stoppen kann. Bisher warte ich ich mit LinkedBlockingQueue.take() bis wieder Daten drinstehen, solang auch noch was nachkommt ist das kein Problem, nur wenn die Aufnahme zuende ist oder eben abgebrochen wird, bleibt take() im blockierenden Modus. Mir fällt auch grad nichts anderes ein wie ich es machen soll, bis die BlockingQueue wegzulassen und immer wenn der eine Thread Daten reinschreibt ein notify() zu machen.
Meint ihr das ist sinnvoll oder kennt ihr eine bessere Möglichkeit?
 
kenn mich mit LinkedBlockingQueue net aus, aber kannst du nicht am Schluss ein bestimmtes Element reinstellen das den anderen Thread sagt: "Übertragung zuende!"
 
mhm und welches? 🙂 normal kommen da nur doubles bzw bytes rein, jenachdem wann ich dekodiere..

habs nun mal so probiert..
Code:
		while(!this.stopped) {
			try {
				if(this.doubleBuffer.size() > 0) {
					newValues = this.doubleBuffer.poll(100, TimeUnit.MILLISECONDS);
				} else {
					continue;
				}

aber ob das effektiv ist wird sich erst zeigen wenn ich soweit bin das live zu testen..
 
Du schiebst Element einer Klasse bzw. davon abgeleitete Klassen in die Queue.
In diesem Fall kannst Du doch in deiner Basisklasse ein public static final Object als Marker erzeugen, bei dem eine Property so gesetzt ist, dass dieses Objekt auf Seiten des Queue-Verarbeiters als Ende-Marker interpretiert wird.

Z.B. wenn Files verarbeitet werden sollen, könnte das Marker-Element durch new File("") repräsentiert werden, nur ein Vorschlag.

Michael
 
Das entkapsel die Bytes die du über die LinkedBlockingQueue bereitstellen willst in eine Klasse, die zusätzlich noch ein boolean enthalten kann der entscheidet obs das letzte Element war oder ob es weitergeht...
 
meinst du das ist effektiver als meine methode? ich sollte möglichst viel rechenzeit einsparen wenn es geht.

*edit*

oder ne einfache sync. list und notify() und bei ende einfach n flag setzen?
 
Zuletzt bearbeitet:
Naja leider sinds primitive Datentypen. double bzw byte

Funktioniert doch:

Code:
List<Number> numbers = new ArrayList<Number>();
byte b = 0x11;
numbers.add(b);
b = numbers.get(0).byteValue();

Mal aus dem Handgelenk. Eclipse akzeptiert den Code. Analog mit double-Werten
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben