Kako odgoditi izvršenje koda na Javi

1. Uvod

Relativno je uobičajeno da Java programi dodaju kašnjenje ili pauzu u svom radu. To može biti korisno za tempo zadataka ili za zaustavljanje izvršavanja dok se drugi zadatak ne dovrši.

Ovaj vodič opisat će dva načina za primjenu kašnjenja u Javi.

2. A Nit-Osnovni pristup

Kada se Java program pokrene, on stvara proces koji se izvodi na glavnom računalu. Ovaj postupak sadrži barem jednu nit - glavnu nit - u kojem se program izvodi. Nadalje, Java omogućuje multithreading, što omogućuje aplikacijama stvaranje novih niti koje se izvode paralelno ili asinkrono glavnoj niti.

2.1. Koristeći Konac.spavati

Brzi i prljavi način pauze u Javi je reći trenutnoj niti da spava određeno vrijeme. To se može učiniti pomoću Thread.sleep (milisekunde):

isprobajte {Thread.sleep (secondsToSleep * 1000); } catch (InterruptedException tj.) {Thread.currentThread (). interrupt (); }

Dobra je praksa zamotati spavati metoda u bloku try / catch u slučaju da druga nit prekine usnulu nit. U ovom slučaju uhvatimo InterruptedException i izričito prekida trenutnu nit, tako da se kasnije može uhvatiti i njome rukovati. To je važnije u programu s više niti, ali još uvijek dobra praksa u programu s jednim nitom u slučaju da kasnije dodamo druge niti.

2.2. Koristeći TimeUnit.spavati

Za bolju čitljivost možemo koristiti TimeUnit.XXX.spavanje (y), gdje XXX je vremenska jedinica za spavanje (SEKUNDE, MINUTEitd.), i g je broj te jedinice za spavanje. Ovo koristi Konac.spavati iza scene. Evo primjera TimeUnit sintaksa:

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

Međutim, postoje neki nedostaci u korištenju ovih metoda temeljenih na nitima:

  • Vrijeme spavanja nije točno precizno, posebno kada se koriste manji vremenski koraci poput milisekundi i nanosekundi
  • Kada se koristi unutar petlji, mirovanje će se lagano pomicati između iteracija petlje zbog drugog izvršavanja koda, tako da vrijeme izvršavanja može postati neprecizno nakon mnogih iteracija

3. An ExecutorService-Osnovni pristup

Java nudi ScheduledExecutorService sučelje, što je robusnije i preciznije rješenje. Ovo sučelje može zakazati pokretanje koda jednom nakon određenog kašnjenja ili u određenim vremenskim intervalima.

Za pokretanje dijela koda jednom nakon odgode možemo koristiti raspored metoda:

ScheduledExecutorService izvršiteljService = Izvršitelji.newSingleThreadScheduledExecutor (); executorService.schedule (Naziv klase :: someTask, delayInSeconds, TimeUnit.SECONDS);

The Naziv klase :: someTask dio je gdje specificiramo metodu koja će se pokrenuti nakon kašnjenja:

  • nekiZadatak je naziv metode koju želimo izvršiti
  • Naziv klase je naziv klase koja sadrži nekiZadatak metoda

Za pokretanje zadatka u određenim vremenskim intervalima možemo koristiti scheduleAtFixedRate metoda:

ScheduledExecutorService izvršiteljService = Izvršitelji.newSingleThreadScheduledExecutor (); executorService.scheduleAtFixedRate (Naziv klase :: someTask, 0, delayInSeconds, TimeUnit.SECONDS);

Ovo će više puta nazvati nekiZadatak metoda, zaustavljanje za delayInSeconds između svakog poziva.

Osim što omogućuje više opcija za određivanje vremena, ScheduledExecutorService metoda daje preciznije vremenske intervale, jer sprečava probleme s zanošenjem.

4. Zaključak

U ovom smo članku razgovarali o dvije metode za stvaranje kašnjenja u Java programima.

Cjeloviti kôd za ovaj članak nalazi se na Githubu. Ovo je projekt zasnovan na Mavenu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.