2016-07-29 7 views
3

Ich möchte einen Java-Code zu einem bestimmten Zeitpunkt auslösen, sagen wir jeden Morgen um 1 Uhr morgens.Wird eine unendliche While-Schleife übermäßige Ressourcen verbrauchen

schreibe ich einen Thread wie folgt:

while (true) { 
    if (currentTime = 1AM) { 
     doSomething; 
    }  
} 

Ich bin ein bisschen Sorge, die while loop am Laufen halten, wird die Maschine verlangsamen oder Verarbeitungsressource auffressen?

Meine erste Frage ist, ich denke, wenn ich nur 1 Mal pro Sekunde Schleife, wird es besser?

while (true) { 
    if (currentTime = 1AM) { 
     doSomething; 
    }  

    Thread.sleep(1000); 
} 

Meine zweite Frage ist, einige Zeit sehe ich while loop wie unten geschrieben, die meisten Zeit, um die Java-Sperre zu erhalten, kann jemand erklären, wie teuer, wenn wir die while loop wie unten (sorry, wenn dies schreiben ist sehr grundlegende Frage)?

while (isLock) { 
    // do nothing 
} 

doThisIfNoLock(); 

erweitere ich die Gedanken über, wenn ich einen leeren Faden, und eine unendliches leeres while loop innen, wie viele Ressourcen (Rechenleistung), die tatsächlich frisst durch den Thread erstellen? Weil es keinen Inhalt in der Schleife gibt, basiert die Schleife, basierend auf meiner Vorstellungskraft, sehr schnell und benötigt viele Zyklen CPU-Leistung? Ist das wahr?

+0

Es gibt Scheduler, solche Dinge zu tun. Schau dir den Quartz Scheduler an. Wenn Sie Spring verwenden, können Sie solche Dinge planen. Ihr Ansatz ist schlecht – TheLostMind

+0

Sogar 'java.util.Timer' ist besser als das, was Sie versuchen. –

+0

Sie können keine unendliche While-Schleife ausführen. Es wird die Ressourcen lutschen und die Verarbeitung verlangsamen. Verwenden Sie stattdessen Scheduler. – Rish

Antwort

4

Es ist keine gute Übung, eine unendliche While-Schleife auszuführen, da dies die CPU beschädigen kann.

Für Geplante Tasks können Sie entweder Bibliotheken wie Quarz verwenden oder verwenden java.util.Timer und java.util.TimerTask

Ihre Aufgabe muss von TimerTask und überschreiben die run() Methode erben. Und dann müssen Sie Time.schedule() Methode verwenden, um Ihre Aufgabe zu planen.

2

Thread.sleep kann in diesem Szenario jedoch eine bessere Option einen Timer ähnlich wie diese

long current = System.currentTimeMillis(); 
while(current < expectedElapsedTime){ 
    current = System.currentTimeMillis(); 
    //logic goes here 
} 

eine Endlosschleife ohne irgendeine Art von Timer wäre mit verwendet werden Ausführen der Schleife verlangsamen wird nach unten aus all Ihre Ressourcen saugen von deinem Computer wie ein Vakuum. Eine andere Art, wie Sie Aufgaben planen können, ist mit einem Swing-Timer

ActionListener listener = new ActionListener(){ 
public void actionPerformed(ActionEvent event){ 
    checkUser = true; 
    } 
}; 
Timer checkUserTimer = new Timer(5000, listener); // 5 second pause 
checkUserTimer.start(); // start the timer.