2016-04-07 18 views
2

Ich habe einen Code ähnlich wie diese, die innerhalb run() Verfahren zur Herstellung eines Runnable und mehrere Instanzen dieser Runnable gestartet ist erhalten,Wie InterruptedException of BlockingQueue behandelt?

do{ 
     try{ 
      String contractNum=contractNums.take(); 
      }catch(InterruptedException e){ 
      logger.error(e.getMessage(), e); 
     } 
    }while(!("*".equals(contractNum))); 

Wo contractNums ist ein BlockingQueue<String> von mehreren Threads gemeinsam genutzt. Es gibt separate Runnables Putting-Elemente zu dieser Warteschlange.

ich über die nächsten Schritte nicht sicher bin, nach InterruptedException fangen, sollte ich diesen Thread beenden, indem er erneut einen RuntimeException (so meine while Schleife beendet) zu werfen oder versuchen InterruptedException nächste Element zu nehmen von contractNum queue wieder und ignoriert?

Ich bin mir nicht sicher, ob InterruptedException als eine fatale Bedingung behandelt werden, damit der Thread endet oder in While-Schleife bleibt.

Bitte vorschlagen.

Antwort

1

Kommt drauf an. Gibt es Orte, an denen Sie den Thread absichtlich unterbrechen, um ihn zum Beispiel zu beenden (zum Beispiel während des Herunterfahrens)? Wenn nicht, müssen Sie nur mit möglichen unechten Interrupts umgehen, die den Thread aufwecken. Wenn die Verarbeitung nicht beeinträchtigt werden soll, ignorieren Sie sie einfach. Sie sind in keiner Weise fatal Ausnahmen, und Sie müssen sie nicht protokollieren (vor allem als Fehler).

+0

Danke. Nein, es gibt keine absichtlichen Unterbrechungen. –

+0

Dann müssen Sie keine besonderen Maßnahmen gegen sie ergreifen. – Kayaman

3

7.1.2 Interruption Politik

Wie Aufgaben eine Stornierungsbedingungen haben sollten, sollten Threads eine Unterbrechung Politik. Eine Unterbrechungsrichtlinie legt fest, wie ein Thread eine Unterbrechungsanforderung interpretiert - was er (wenn überhaupt) tut, wenn eine erkannt wird, welche Arbeitseinheiten in Bezug auf Unterbrechung als unteilbar betrachtet werden und wie schnell sie auf Unterbrechung reagiert. Die sinnvollste sinnvolle Unterbrechungsrichtlinie ist eine Form der Thread-Level- oder Service- Level-Annullierung: Beenden Sie so schnell wie möglich, Bereinigen, wenn notwendig ist, und möglicherweise eine besitzende Entität benachrichtigt, dass der Thread beendet wird. Es ist möglich, andere Unterbrechungsrichtlinien wie wie Pausieren oder Fortsetzen eines Dienstes einzurichten, aber Threads oder Threadpools mit nicht standardmäßigen Unterbrechungsrichtlinien müssen möglicherweise auf Aufgaben beschränkt werden, die in Kenntnis der Richtlinie geschrieben wurden.

7.1.3 Reaktion

zur Unterbrechung Wie bereits erwähnt vor dem, wenn Sie eine unterbrechbare Blockierungsmethode wie Thread.sleep oder BlockingQueue.put nennen, gibt es zwei praktische Strategien für den Umgang mit InterruptedException:

• Verteilen Sie die Ausnahme (möglicherweise nach einer aufgabenspezifischen Bereinigung), machen Sie Ihre Methode eine unterbrechbare Blockiermethode auch; oder

• Stellen Sie den Unterbrechungsstatus wieder her, damit der Code weiter oben auf dem Aufruf Stapel damit umgehen kann.

Java Concurrency in Practice Kapitel 7.

Insbesondere in Ihrem Code müssen Sie sicherstellen, dass, wenn Thread Anwendungslogik gebrochen wird nicht unterbrochen wird. Und es ist in der Tat besser, Ihre Unterbrechungsausnahme zu fangen. Was damit zu tun ist, ist dir sicher, dass du die Anwendungslogik nicht durchbrichst.

+2

Vielen Dank für das Zitat dieses Buches. Auf Seite 143 - 144 wird mein Szenario beschrieben und schlägt vor, dass ich "Thread.currentThread.interrupt()" nur einmal in einem äußeren 'finally'-Block aufrufen muss, wenn der Thread fertig ist - unabhängig davon, wie oft diese Ausnahme aufgetreten ist ist geworfen. In inneren Fang, sollte ich Ausnahme ignorieren und erneut versuchen, '()' Elemente aus der Warteschlange. –