2016-08-08 11 views
4
zunehmenden

i ExecutorService verwenden nur eine Aufgabe zu einem Zeitpunkt, zu excecute diesen Code mit `Anzahl der aktiven Threads hält

und ich bin mit Thread.activeCount() die Anzahl der aktiven Threads zu bekommen, aber wenn ich ein lauffähiges einreichen Aufgabe an den ExecutorService die Anzahl der aktiven Threads wird um eins erhöht, wie ist das möglich? Ich dachte, newSingleThreadExecutor() ermöglicht die Ausführung nur einer Aufgabe zu einer Zeit, warum steigt die Anzahl der Threads weiter? , ich meine, sollte nicht die Anzahl der Threads nur um eins steigen und nicht mehr?

Beachten Sie, dass ich auch Zukunft verwenden, um die Ausführung aller ausführbaren Running vor dem Einreichen einer neuen Aufgabe abzubrechen, und es funktioniert gut, alle Runnables sind unterbrochen, aber die Anzahl der aktiven Threads nimmt weiter zu.

Edit: dies ist der Code, den ich anrufen, wenn ich auf einen Knopf drücken (Worker ist nur eine Klasse, die runnable implementiert)

private void handle() { 
    executorService=Executors.newSingleThreadExecutor(); 
    Worker worker=new Worker(); 
    future=executorService.submit(new Worker()); 
} 
+1

Vielleicht ist Ihr Fall: http://stackoverflow.com/a/27297989/6028746 –

+1

oh meinen Sie ich nur diesen Code aufrufen sollte ExecutorService = Executors.newSingleThreadExecutor(); 'nur einmal ? – has19

+0

Nein, aber vielleicht das Framework neue Referenz initiieren, wenn Sie es wieder anrufen –

Antwort

2

Jedes Mal, wenn Sie es nennen es cretes eine neue Executor. Jeder einzelne Thread-Executor hat seinen eigenen Thread. Wenn Sie mehrere Jobs auf diesem Executor ausführen möchten, rufen Sie newSingleThreadedExecutor einmal auf und senden alle Jobs an diesen Executor. Sie rufen newSingleThreadedExecutor nicht mehrfach

+0

Wenn ich das tue, funktioniert nur die erste Aufgabe an den Executor, wenn ich eine andere Aufgabe abschicken funktioniert es nicht mehr, obwohl die erste Aufgabe abgeschlossen ist – has19

+0

oops Ihr Recht, ich habe versucht, dies für etwa 10 Stunden zu lösen, scheint es, dass meine Aufgabe nie wirklich beenden, weil ich Looper.loop am Ende des Laufs Methode aufgerufen – has19

+1

THat macht Sinn. Wenn Sie Looper.loop() aufrufen, wartet es auf immer neue Nachrichten und beendet die Aufgabe daher nie wirklich. Das bedeutet, dass andere Aufgaben, die Sie planen, nie ausgeführt werden. –