# Kommandozeilen-Programm unendlich lang ausführen



## DStrohma (10. Feb 2011)

Hi an alle,

folgende Situation: Ich habe ein Kommandozeilen-Programm und das soll *nicht* terminieren. Also ewig weiter laufen. Aber wie mache ich das? Ich habe sowas hier:


```
while (true) {
            try {
                new Thread().sleep(5000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
```

Aber ich kann mir gerade nicht vorstellen dass man das normaler Weise so macht  Da meine Anwendung wirklich nicht terminieren soll und auf einem Server laufen wird, wäre ich froh wenn mir jemand eine Idee geben könnte wie man sowas im Normalfall macht.

DANKE im Voraus,
DS

PS: Das Programm wartet bis eine XMPP Nachricht ankommt, danach wird die verarbeitet und das Programm wartet auf die nächste Nachricht.


----------



## XHelp (10. Feb 2011)

Dann kannst du den "Warte auf Nachricht"-Teil in eine while(true) Schleife setzen.


----------



## DStrohma (10. Feb 2011)

Das hatte ich soweit auch aber mir kam es so vor als würde meine CPU Auslastung ziemlich nach oben geschraubt werden durch die while(true) Schleife. Deshalb hab ich da noch diesen neuen Thread schlafen gelegt.

Meinst du das ist egal ob in der Schleife noch was drin steht oder nicht?


----------



## XHelp (10. Feb 2011)

Wie wartest du denn auf eine Nachricht? Normalerweise sollte sowas blockieren.
Nein, das ist nicht egal. Eine leere while(true) Schleife ist eine nutzlose Endlosschleife.


----------



## DStrohma (10. Feb 2011)

Es gibt einen PacketListener der zu einer XMPPConnection hinzugefügt wird. Das wartet dann (erfolgreich) auf eine Nachricht und wenn eine ankommt, dann wird sie verarbeitet. Aber das ist kein Grund das Programm nicht zu terminieren.

Ich verwende die Smack API


----------



## eRaaaa (10. Feb 2011)

Kannst du nicht den PacketCollector anstelle des Listeners verwenden? (Bzw. ist das nicht das was du suchst? )


----------



## DStrohma (10. Feb 2011)

Ja ich könnte das auch verwenden. Vielleicht so in der Art??


```
PacketCollector collector = connection.createPacketCollector(filter);

        // Run forever
        while (true) {
            Packet packet = collector.nextResult();
            if (packet instanceof Message) {
                Message msg = (Message) packet;

                // ...
            }
        }
```

Das würde wohl auch gehen. Jetzt muss ich aber schon mal blöd fragen: Ist das jetzt wirklich besser


----------



## despikyxd (10. Feb 2011)

omg ... das ist schonwieder ein so genialer FAIL

new Thread().sleep()

ähm ja ...
kumpel .. ich verrat dir mal was ... durch genau so einen blödsinn schraubst du deine system-auslastung nach oben ... weil die while() macht nichts weiter als ohne unterbrechung neue threads zu erstellen ...
wenn du deine while() durchsowas zeitweise "unterbrechen" willst ... dann musst du die komplette while in einen Thread *oder halt ein Runnable* packen und dann darin this.sleep() aufrufen ...
und wehe du fragst jetzt wie das gemacht wird ... dafür gibt es google ...

und wie oben bereits gesagt ... solche api's sollten normalerweise blockieren bis das erwartete event eintritt ... von daher sollte die auslastung sehr gering bleiben ...

und das mit dem NICHT TERMINIEREN ... was meinst du wohl wie die meisten server-apps arbeiten ... eben genau mit solchen endlos-schleifen ... anderst wäre es auch nicht machbar ... und ist es auch nicht in irgendwelchen anderen sprachen ...
von daher ist deine "sorge" um die auslastung völlig fehl am platz ...


btw : das thema sollte mal ins NETZWERK-forum verschoben werden weil es doch etwas mehr damit zu tun hat


----------



## DStrohma (10. Feb 2011)

Mir ist schon klar dass ich damit jedes mal einen neuen Thread erstelle. Aber ich hätte angenommen dass wenn die Threads nicht gebraucht werden, dass sie dann ziemlich schnell vom Garbage Collector wieder vernichtet werden. Außerdem habe ich das nur gemacht weil die Auslastung mit einer while(true) Schleife bei meinem System höher ist als mit Thread().sleep


----------



## DStrohma (10. Feb 2011)

Ach was solls, mir ist die Lust vergangen aber danke für die Hilfe!


----------



## eRaaaa (10. Feb 2011)

DStrohma hat gesagt.:


> Ach was solls, mir ist die Lust vergangen aber danke für die Hilfe!



Du lässt dich zu schnell entmutigen. Ist doch okay wenn man nachfragt. despikyxd hat zwar Recht, man kann sich aber auch netter ausdrücken!
Deine Antwort auf seine Anmerkung macht allerdings in Hinsicht auf deine Problematik nicht viel Sinn 

"Außerdem habe ich das nur gemacht weil die Auslastung mit einer while(true) Schleife bei meinem System höher ist als mit Thread().sleep" - verstehe ich leider nicht!

Ich kann jetzt auch nicht wirklich erkennen was jetzt deine noch offene Frage ist, die noch nicht beantwortet wurde. Ob sich jetzt die CPU Auslastung verbessert hat durch den Collector(der ja wartet) kannst du doch selbst leicht testen, aber ich denke ja, das ist hier der Weg den du gehen wolltest.
Ansonsten kannst du ja auch selbst pollen, allerdings wissen wir ja nicht was du genau machen willst.

p.s.: ich soll dir von Eldorado ausrichten : "dein Blog geht nicht"


----------



## DStrohma (10. Feb 2011)

Ich meinte damit, dass bei mir die Auslastung mit einer reinen while(true) Schleife höher war als wenn ich eine while(true) Schleife habe in der eben ein Thread erzeugt wird der schläft. Zumindest zeigt mir das meine CPU Auslastung so an.

Das mit dem PacketCollector war ein guter Tipp. Ich wollte letztlich nur wissen ob man das in einem produktiven Umfeld wirklich mit einer while(true) Schleife macht (kommt mir als Neuling einfach primitiv vor) und ob ich das richtig verstanden habe dass ich den collector dann einfach in die while Schleife packen kann.

Doch der Blog geht schon aber nicht wenn man einfach nur die Adresse eingibt, das wäre ja langweilig  Aber du darfst dich gerne an meinem neuen Spielplatz umsehen: Home - CRACKBABY - Because life is a game


----------



## despikyxd (10. Feb 2011)

das sich die cpu-last senkt ist nur ein trügender schein ...
jedem prozess wird eine gewissen cpu-zeit zugeteilt ... und wenn du die zeit die du dann effektiv im cpu rechnest damit verschwendest threads zu erstellen die dann schlafen belegen diese threads die cpu-zeit des prozesses die dann für andere wichtigere operationen nicht mehr zur verfügung steht ... so senkt sich die cpu-last da du einen großteil der cpu-zeit damit verschwendest eben zu schlafen *sleep* .. und das bisschen was überbleibt wird in die erstellung von threads gepackt ... was halt nicht wirklich ne last is ...
wenn du dagegen mit methoden-aufrufen die blockieren die zeit sinnvoller nutzt in dem du halt wirklich darauf wartest das die blockierende methode endlich returnt ist das wirklich resourcen schonender als wenn du dauernt methoden pollen würdest die nicht blockieren ...


----------



## Antoras (10. Feb 2011)

Du sollst auch nicht einen neuen Thread erzeugen und den dann schlafen legen sondern den momentan Aktiven: [c]Thread.sleep(1);[/c]
1 ms sleep-time reicht vollkommen aus um die CPU nicht unnötig zu belasten, wobei du den Wert natürlich beliebig anpassen kannst. Nur halt nicht auf 5s, wie im Anfangspost dargestellt, das würde nämlich dafür sorgen, dass dein Server übelst laggt...

Und ja, eine Schleife ist gängige Praxis. wie willst du es auch sonst machen? Wobei ich nicht empfehlen würde wirklich eine Endlosschleife zu erstellen, sondern eine Schleife, die einen Wahrheitswert überprüft: [c]while (isRunning)[/c] Das gibt dir immer die Möglichkeit das Programm "normal" zu beenden und es nicht gleich mit System.exit() zu massakrieren (jedes Programm muss irgendwann mal beendet werden. Und wenn es nur zum Warten des Servers ist).

Selbst wenn du ein Framework oder eine Lib benutzt und damit nicht selbst eine Schleife erstellen musst - sie ist dennoch vorhanden. Nur halt eben im genutzten Unterbau "versteckt".


----------

