BlockingQueue mit maximaler Groesse 1?

sirbender

Top Contributor
Hi,

ich habe eine BlockingQueue<Runnable> und wuerde gerne dass wenn ich ein Runnable hinzufuege und schon eines drin ist, dieses erstmal entfernt wird und dann das neue hinzugefuegt wird. Zu keinem Zeitpunkt sollte die Groesse der Queue also 1 uebersteigen.

Nun soll aber das entfernen des alten Runnable und das hinzufuegen des neuen Runnables 'atomical' sein. Es soll also nicht moeglich sein, dass ein anderer Thread nachdem ich das alte Runnable entferne selbst eines hinzufuegt und somit am Ende 2 Runnables in der Queue stecken. Wie kann ich das am besten synchronisieren?

so vielleicht?
synchronized (taskQueue) {
taskQueue.clear();
taskQueue.add(job);
}
 

ThreadPool

Bekanntes Mitglied
Versuchs mal mit einem SynchronousQueue, oder du erstellst dir einen ArrayBlockingQueue oder LinkedBlockingQueue mit einer Kapazität von 1.
 

Marco13

Top Contributor
Die Kapazitätsbeschränkung bewirkt, das gewartet wird, bis platz frei ist. "Die" Lösung (bzw. eine schönere als mit einiger manueller Synchronisation) kenne ich spontan auch nicht...
 

ThreadPool

Bekanntes Mitglied
Die Kapazitätsbeschränkung bewirkt...

Ja das bewirkt doch genau das was er haben möchte, zu keinem Zeitpunkt kann mehr als ein Runnable im Queue sein. D.h. wenn jmd einen hinzufügen möchte muss er den erst rauslöschen oder halt eben warten. Aber wenn es um diese Art der reinen Datenhaltung geht kann man auch irgendwas nehmen und drauf synchronisieren, da verstehe ich die Verwendung von einem BlockingQueue nicht.
 

Marco13

Top Contributor
Hm. Vielleicht geht um das Warteverhalten beim "poll" usw, das ansonsten mit eigenen wait/notify-Konstrukten nachgebaut werden müßte? :bahnhof:
 

ThreadPool

Bekanntes Mitglied
Er könnte auch sowas in der Art machen (rein als Bsp. zu verstehen), wenn er nicht das Interface implementieren möchte mutiert das zu einer Helperklasse und er kann weniger Methoden anbieten...

Java:
final class MeinBlockingQueue<E> implements BlockingQueue<E>{
	private final ArrayBlockingQueue<E> _queue;
	
	public MeinBlockingQueue(int cap){
		_queue = new ArrayBlockingQueue<E>(cap);
	}

	public synchronized boolean addAfterClear(E e){
		clear();
		return add(e);
	}
	
	private BlockingQueue<E> queue(){
		return _queue;
	}
	
	public boolean add(E e) {
		return queue().add(e);
	}

.........
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben