2017-07-28 5 views
0

Ich bin vertraut mit der traditionellen Thread-Implementierung, aber nicht so sicher über Executorservice. Ich weiß, dass es sehr praktisch ist, wenn man Threads mit dem Executor-Service behandelt. Aber ich bin etwas verwirrt über die Implementierung.Wie funktioniert der Executorservice in Java?

Nehmen wir an, ich habe einen übergeordneten Thread/Hauptthread und einen Executor-Service, der max Thread-Poolgröße 10 hat. Jetzt möchte ich eine bestimmte Aufgabe auf einer JMS-Warteschlange nur ausführen, wenn ihre Größe weniger als 1000 ist Ich kann wahrscheinlich denken, dies auf zwei Arten zu implementieren.

Fall 1:

class MyThreadClass inmplements Runnable { 
     public static void main(String args[]){ 
      while(true){ 
       int checkQueueSize = jmsQueue.getSize(); 
       while(checkQueueSize<1000){ 
        threadPoolTaskExecutor.execute(this); 
        ++checkQueueSize; 
       } 
      } 
     } 
     public void run(){ 
      jmsQueue.pushMessage("Hello Thread"); 
     } 
} 

Fall 2:

class MyThreadClass inmplements Runnable { 
      public static void main(String args[]){ 
      threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true); 
       threadPoolTaskExecutor.execute(this); 
      } 
      public void run(){ 
       while(true){ 
        int checkQueueSize = jmsQueue.getSize(); 
        while(checkQueueSize<1000){ 
         jmsQueue.pushMessage("Hello Thread"); 
         ++checkQueueSize; 
        } 
       } 
      } 
    } 

Mein Verständnis ist Fall 2 wird nicht mehr als ein Thread überspannen. Bin ich richtig oder nicht? Oder gibt es eine andere Möglichkeit, die Aufgabe auszuführen?

+0

'setWaitForTasksToCompleteOnShutdown' Teil des Federrahmen ist - fragen Sie in diesem Zusammenhang? – assylias

+0

Ja. Aber wenn es anders geht, ist es sehr willkommen. – Satyaprakash

+0

Ihre Anweisung 'while (checkQueueSize <= 1000)' wird immer dann endlos durchlaufen, wenn die lokale Variable 'checkQueueSize' kleiner als oder gleich 1000 ist. Nichts in der Schleife kann den Wert der Variablen ändern. –

Antwort

0

"Fall 2 wird nicht mehr als einen Thread umfassen" Ja. Das ist richtig. Weil Sie execute nur einmal anrufen. Im ersten Szenario können Sie oft execute aufrufen. Und wenn die vorherige Aufgabe nicht abgeschlossen ist, wird zusätzlicher Thread unrundiert.

+0

Also kann ich annehmen, dass der ** Fall 1 ** der Implementierung ziemlich perfekt ist? – Satyaprakash

+0

Ich persönlich bevorzuge es nicht, "perfektes" Wort zu verwenden, aber ja, wie Executor-Service verwendet werden sollte. Auch wenn es einen Fehler enthält, sollten Sie das innere 'while' durch' if' ersetzen. Es ist auch gut, etwas Verzögerung hinzuzufügen, sonst wird es viele Prozessor-Ticks verbrauchen. – talex

+0

Danke für Ihren Vorschlag. Aber ich kann das innere 'while' nicht durch' if' ersetzen, denn kurz vor dem inneren 'while' gibt es eine' getSize() 'Methode, die' jmx' Verbindung verwendet, um die 'jmsQueue' Größe zu erhalten. Wenn ich also das innere 'while' durch' if' ersetze, dann wird für jede Iteration eine 'jmsQueue'-Größe angefordert, was eine schwere Operation ist. Jedenfalls ist dein Vorschlag oben im Ans Feld was ich suche. Also als beschmiert markieren. – Satyaprakash

0

Bitte meinen Code finden: -

class MyThreadClass inmplements Runnable { 
     public static void main(String args[]){ 
      threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true); 
      for(int i=0;i<10;i++) 
      threadPoolTaskExecutor.execute(this); 
     } 
     public void run(){ 
      while(true){ 
       int checkQueueSize = jmsQueue.getSize(); 

       if(checkQueueSize<=1000){ 
        jmsQueue.pushMessage("Hello Thread"); 
       } 
      } 
     } 
    } 

Modifikation: -

  1. die 10 Threads erstellen und ordnen diese Aufgabe auszuführen, indem Sie Ihre Runnable-Klasse-Objekt übergeben.
    1. Entfernen Sie unnötige While-Schleife als die äußere Schleife, die infite Iteration durchführt.
+0

Es ist ein schöner Vorschlag. Aber denken Sie nicht, dass die Threads in diesem Fall niemals in den Leerlaufzustand übergehen, selbst wenn es keine Aufgabe gibt, die ausgeführt werden muss? – Satyaprakash

Verwandte Themen