2017-08-29 2 views
0

Ich implementiere das Producer/Consumer-Muster und verwende die LinkedTransferQueue-Sammlung.Wie kann ich die Größe der LinkedTransferQueue einschränken?

Ich möchte nicht, dass mein Hersteller bestimmte Speicherbeschränkungen überschreitet.

Derzeit bin ich diesen Scheck, sondern aus den documentation, Größe Betrieb erfordert O (N) Traversal. Für meine aktuelle Implementierung ist es in Ordnung,

aber gibt es einen besseren Ansatz als die, die ich derzeit bin?

LinkedTransferQueue<String> producerStringLinkedTransferQueue = new LinkedTransferQueue<String>(); 

if (producerStringLinkedTransferQueue.size() <= 5000) { 
    producerStringLinkedTransferQueue.add(<some data>); 
} 
+0

Dies ist sicherlich nicht der Weg, es zu tun. ["die aktuelle Anzahl der Elemente zu bestimmen ... kann ungenaue Ergebnisse melden, wenn diese Sammlung während der Traversierung geändert wird."] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ LinkedTransferQueue.html) – Michael

+0

vereinbart :), da ich nicht sehr streng mit der Größe Validierung sein muss, habe ich diesen Ansatz verwendet, aber es sollte nicht verwendet werden, wenn die Größe Validierung sehr streng ist –

Antwort

1

Wenn Sie wollen nichts tun, wenn Warteschlange voll ist (nicht ersetzen seine älteste Artikel wie zum Beispiel Apache commons Sammlungen CircularFifoQueue der Fall ist), dann können Sie LinkedTransferQueue in Ihrer benutzerdefinierten Klasse wickeln und benötigt Methoden implementieren für Berechnen der Größe der Warteschlange:

public class LimitLinkedTransferQueue<E> { 
    LinkedTransferQueue<E> queue = new LinkedTransferQueue<>(); 
    private final long maxSize; 
    private long size = 0; 

    public LimitLinkedTransferQueue(long maxSize) { 
     super(); 
     this.maxSize = maxSize; 
    } 

    public boolean add(E e) { 
     if (this.size == this.maxSize){ 
      return false; 
     } 
     boolean result = queue.add(e); 
     if (result) { 
      size++; 
     } 
     return result; 
    } 

    public E take() throws InterruptedException { 
     E item = queue.take(); 
     size--; 
     return item; 
    } 
    // other need methods 
} 
+0

Ziemlich gute Lösung. Es würde sich lohnen, einige Schnittstellen wie "Iterable" zu implementieren. Sie können (und sollten) 'maxSize' final machen, indem Sie' Integer.MAX_VALUE' entfernen. Es ist auch nicht threadsicher - "LinkedTransferQueue" ist eine gleichzeitige Sammlung, also hätte ich erwartet, dass eine begrenzte auch threadsicher ist. – Michael

+1

Ja, Sie haben Recht. Ich habe die Antwort für 'maxSize' bearbeitet und es ist auch notwendig, den Code für Thread Safe zu verbessern. – Nikolay

Verwandte Themen