2009-07-07 11 views
2

Javas Executor ist (so weit ich es verstehe) eine Abstraktion über das ThreadPool-Konzept - etwas, das Aufgaben annehmen und ausführen kann.ThreadPool ist Executor wie Polling ist?

Ich bin auf der Suche nach einer ähnlichen Ausnahme für das Polling-Konzept. Ich muss fortlaufend Elemente aus einer bestimmten Warteschlange abfragen (die implementiert nichtBlockingQueue), führen Sie sie aus und Ruhezustand, und wiederholen Sie alles bis zum Herunterfahren.

Gibt es eine fertige Abstraktion oder sollte ich etwas selbst schreiben?

(Vorschläge einer besseren Titel sind willkommen)

+0

Titelvorschlag: "Wie kann ich eine benutzerdefinierte Warteschlange in die j.u.c-Executoren integrieren?" –

+0

Für mich ist Titel in Ordnung, ich habe aus Ihrem Titel verstanden, was Sie wollten. Und es hat einen rätselhaften Klang. – flq

+0

Nun, ein Vorschlag ist, Quartz ffs zu verwenden! Ich denke nicht, dass der Titel überhaupt klar ist. Polling ist ein paar Zeilen Code (siehe meine Antwort unten), während ein Thread-Pool tausend sein kann. Warum brauchen Sie eine Abstraktionsschicht für ein paar Loc? –

Antwort

2

Polling ist einfach:

Thread t = new Thread(new Runnable() { 
    public void run() { 
     try { 
      while (!t.isInterrupted()) { 
       Object item; 
       while ((item = queue.take()) == null) {//does not block 
        synchronized (lock) { lock.wait(1000L) } //spin on a lock 
       } 
       //item is not null 
       handle(item); 
      } 
     } catch (InterruptedException e) { } 
    } 
}); 
t.start(); 

Vielleicht müssen Sie Ihre Frage neu zu formulieren, wie ich genau bin nicht ganz sicher, was es ist, dass Sie versuchen, machen?

+0

Meine eigene Warteschlange ist etwas Eigenes (eine GigaSpaces-Warteschlange), sie implementiert die BlockingQueue-Schnittstelle nicht. – ripper234

+0

Dann fügen Sie einen einfachen Adapter, der die Schnittstelle implementiert und delegiert auf Ihre Warteschlange impl –

+0

Ich kann nicht - GigaSpaces ist ein verteiltes Raster - die Push() - Operationen auf die Warteschlange sind auf einem anderen Computer getan. Ergo, was ich brauche, ist das eigentliche Polling - ich sehe nicht, wie ich BlockingQueue implementieren kann. – ripper234