Frage

Der Titel dieser Frage macht mich zweifeln, ob diese existieren, aber nach wie vor:

Ich bin interessiert, ob es eine Umsetzung von Java Blocking , dass nach ihrer Größe begrenzt ist, und nie blockiert, sondern löst eine Ausnahme bei dem Versuch, zu viele Elemente einzureihen.

Bearbeiten - Ich bin den Blocking auf eine Executor vorbei, die ich seine Add nehme verwendet () -Methode nicht bieten (). Man kann eine Blocking schreiben, die eine andere Blocking und Delegierten wickelt Anrufe () hinzufügen zu bieten ().

War es hilfreich?

Lösung

Edit: Auf der Basis Ihrer neuen Beschreibung Ich glaube, dass Sie die falsche Frage sind zu fragen. Wenn Sie eine Executor verwenden sollten Sie wahrscheinlich eine benutzerdefinierte RejectedExecutionHandler anstatt Modifizieren der Warteschlange. Dies funktioniert nur, wenn Sie eine ThreadPoolExecutor verwenden, aber wenn Sie nicht, es wäre wahrscheinlich eine bessere Idee sein, den Exekutor anstatt die Warteschlange zu ändern.

Es ist meine Meinung, dass es ein Fehler ist, bietet außer Kraft zu setzen und es wie add macht verhalten. Interface-Methoden stellen einen Vertrag. Client-Code, die Warteschlangen hängt von den Methoden tatsächlich tun, was die Dokumentation gibt Verwendungen zu blockieren. diese Regel zu brechen öffnet für eine Welt des Schmerzes auf. Das, und es ist unelegant.


Die hinzufügen () Verfahren auf BlockingQueues das tut, aber sie haben auch eine Angebot () Verfahren, die im allgemeinen eine bessere Wahl ist. Aus der Dokumentation für Angebot ():

  

Fügt das angegebene Element bei der   Schwanz dieser Warteschlange, wenn es möglich ist,   dies unverzüglich zu tun ohne Überschreitung   die Warteschlange der Kapazität, Return wahr   bei Erfolg und false, wenn diese Warteschlange   ist voll. Diese Methode ist in der Regel   Verfahren vorzuziehen add (E), dem   scheitern, ein Element zum Einfügen nur durch   werfen eine Ausnahme.

Dies funktioniert für alle solche Warteschlangen unabhängig von der spezifischen Implementierung (ArrayBlockingQueue, LinkedBlockingQueue usw.)

BlockingQueue<String> q = new LinkedBlockingQueue<String>(2);
System.out.println(q.offer("foo")); // true
System.out.println(q.offer("bar")); // true
System.out.println(q.offer("baz")); // false

Andere Tipps

  

Man kann eine Blocking schreiben, dass   Wraps andere Blocking und   Delegierten () aufrufen, hinzufügen zu bieten ().

Wenn das soll eine Frage sein ... die Antwort „Ja“, aber man kann es ordentlich tun, indem Sie eine Unterklasse erstellen, die das Add außer Kraft gesetzt (). Der einzige Haken (in beiden Fällen) ist, dass Ihre Version von add keine Ausnahmen geprüft werfen können, die nicht in dem Verfahren sind Sie überschreiben, so dass Ihre „blockieren würde“ Ausnahme müssen nicht markiert werden.

Das ist traurig, kann man nicht blockieren, da so viele Anwendungsfälle, wo Sie blockieren wollen würden, die ganze Idee, Ihre eigene begrenzt blockiert Warteschlange an den Testamentsvollstrecker der Bereitstellung hat keine Bedeutung.

public void execute(Runnable command) {
        if (command == null)
            throw new NullPointerException();
        if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(command)) {
            if (runState == RUNNING && workQueue.***offer***(command)) {
                if (runState != RUNNING || poolSize == 0)
                    ensureQueuedTaskHandled(command);
            }
            else if (!addIfUnderMaximumPoolSize(command))
                reject(command); // is shutdown or saturated
        }
    }

Ein einfacher Anwendungsfall Anfragen von Quelle db in Charge (Testamentsvollstrecker) ausgeführt zu bekommen, im Batch bereichern und in einer anderen db (Testamentsvollstrecker) setzen, würden Sie Abfragen auszuführen nur so schnell, wie sie in einer anderen db gesetzt werden. In diesem Fall sollte die dest Testamentsvollstrecker eine Blockierung beschränktes Testamentsvollstrecker akzeptiert das Problem zu lösen, als Polling zu halten und prüfen, wie viele wurden mehr Abfragen auszuführen abgeschlossen.

oops mehr finden Sie in meinem Rest Kommentar:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top