Ako oneskoriť spustenie kódu v Jave

1. Úvod

Je pomerne bežné, že programy Java pridávajú do svojej činnosti oneskorenie alebo pozastavenie. To môže byť užitočné pri stimulácii úloh alebo pozastavení vykonávania, kým sa nedokončí iná úloha.

Tento tutoriál popíše dva spôsoby implementácie oneskorení v Jave.

2. A Závit-Založený prístup

Po spustení programu Java sa spustí proces ktorý beží na hostiteľskom počítači. Tento proces obsahuje najmenej jedno vlákno - hlavné vlákno - v ktorom program beží. Ďalej Java umožňuje multithreading, ktorý umožňuje aplikáciám vytvárať nové vlákna, ktoré bežia paralelne alebo asynchrónne s hlavným vláknom.

2.1. Použitím Závit. Spánok

Rýchly a špinavý spôsob pozastavenia v prostredí Java je povedať aktuálnemu vláknu, aby po stanovenú dobu spalo. To je možné vykonať pomocou Thread.sleep (milisekundy):

skus {Thread.sleep (secondsToSleep * 1000); } catch (InterruptedException ie) {Thread.currentThread (). interrupt (); }

Je dobrým zvykom zabaliť spať metóda v bloku try / catch v prípade, že iné vlákno preruší spánkové vlákno. V tomto prípade chytíme Prerušená výnimka a vyslovene prerušiť aktuálne vlákno, aby sa dalo neskôr zachytiť a spracovať. To je dôležitejšie v programe s viacerými vláknami, ale stále je to dobrá prax v programe s jedným vláknom pre prípad, že by sme neskôr pridali ďalšie vlákna.

2.2. Použitím TimeUnit.sleep

Pre lepšiu čitateľnosť môžeme použiť TimeUnit.XXX.sleep (y), kde XXX je časová jednotka na spanie (SEKUNDY, MINÚTYatď.) a r je číslo tejto jednotky na spanie. Toto používa Závit. Spánok v zákulisí. Tu je príklad súboru TimeUnit syntax:

try {TimeUnit.SECONDS.sleep (secondsToSleep); } catch (InterruptedException tj.) {Thread.currentThread (). interrupt (); }

Avšak použitie týchto metód založených na vláknach má určité nevýhody:

  • Časy spánku nie sú úplne presné, najmä keď sa používajú menšie časové prírastky, ako sú milisekundy a nanosekundy
  • Ak sa spánok použije vo vnútri slučiek, bude sa mierne pohybovať medzi iteráciami slučiek v dôsledku vykonania iného kódu, takže čas vykonania môže byť po mnohých iteráciách nepresný.

3. An ExecutorService-Založený prístup

Java poskytuje ScheduledExecutorService rozhranie, čo je robustnejšie a presnejšie riešenie. Toto rozhranie môže naplánovať spustenie kódu raz po stanovenom oneskorení alebo v pevne stanovených časových intervaloch.

Na spustenie časti kódu po oneskorení môžeme použiť príkaz harmonogram metóda:

ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor (); executorService.schedule (Classname :: someTask, delayInSeconds, TimeUnit.SECONDS);

The Názov triedy :: someTask v časti určujeme metódu, ktorá bude bežať po oneskorení:

  • someTask je názov metódy, ktorú chceme vykonať
  • Názov triedy je názov triedy, ktorá obsahuje someTask metóda

Na spustenie úlohy v pevne stanovených časových intervaloch môžeme použiť scheduleAtFixedRate metóda:

ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor (); executorService.scheduleAtFixedRate (Classname :: someTask, 0, delayInSeconds, TimeUnit.SECONDS);

Toto bude opakovane volať someTask metóda, pozastavenie pre delayInSeconds medzi každým hovorom.

Okrem toho, že umožňuje viac možností časovania, ScheduledExecutorService metóda poskytuje presnejšie časové intervaly, pretože zabraňuje problémom s driftom.

4. Záver

V tomto článku sme diskutovali o dvoch metódach vytvárania oneskorení v programoch Java.

Celý kód tohto článku nájdete na stránkach Github. Toto je projekt založený na Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


$config[zx-auto] not found$config[zx-overlay] not found