1. Thread.sleep()
metodu
Java-da proqramın işinə fasilələr əlavə etmək olar. Adətən bu lazım olmur, çünki istifadəçilər proqramlarının mümkün qədər tez işləməsini istəyir. Onlardan heç kim sevinməyəcək ki, əgər siz öz kodunuzu qəsdən yavaşlatsanız.
Ama siz proqramçı olaraq, kodda fasilənin faydalı ola biləcəyi bir çox vəziyyətlə qarşılaşa bilərsiniz. Məsələn, siz bir oyun proqramlaşdırırsınız və istəyirsiniz ki, o hər iki saniyədən bir və ya bir neçə dəfə saniyə ərzində hərəkət etsin.
Ümumiyyətlə, fasilə faydalı bir şeydir, ona görə də kodda fasiləni necə əlavə edə bilərik baxaq. Bu əslində çox sadədir:
Thread.sleep(vaxt);
Burada vaxt
— fasilənin uzunluğu millisaniyədədir (1/1000
saniyə hissəsi).
Belə bir əmrin icrası proqramınızı vaxt
millisaniyə dayandıracaq. Nümunələr:
|
Proqramı 2 saniyəlik dayandıracaq. |
|
Proqramı yarım saniyəlik dayandıracaq. |
|
Proqramı 1 saatlıq dayandıracaq. |
Bu praktikada necə istifadə edilə bilər. Təxmin edin, biz kosmik gəminin işə salınması üçün proqram yazırıq. Onun kodu belə görünə bilər:
|
Proqram hər saniyə 10 , sonra 9 , sonra 8 və s. ədədləri ekrana çıxaracaq.Sayma 0 -a çatdıqda proqram Başladıq yazısını göstərəcək. |
2. Fasilələrin düzgün hesablanması
Fasilənin uzunluğunu hesablamaq asandır. Əgər sizə lazımdır ki, proqram hər saniyədə bir şey etsin, fasilə qoyun — 1000 ms. Əgər saniyədə 2 dəfə olsun, fasilə 500 ms (1000/2) qoyun.
Əgər saniyədə 15 dəfə bir şey etmək lazımdırsa, fasiləni 66 ms (1000/15) uzunluğunda edirik. Hər şey çox sadə görünür:
Bir dövrün uzunluğu = 1000 / saniyədə olan dəfə sayı
Ama burada çox vacib bir nüans var. Çox komanda çox sürətli yerinə yetirilsə də, onlar dərhal icra edilmir.
Baxın. Tutaq ki, 100 ms vaxt aparan bir hərəkətiniz var. Bunun saniyədə 5 dəfə yerinə yetirilməsini istəyirsiniz. Hansı fasilə uzunluğu seçməlisiniz? Əlbəttə ki, 200 ms yox.
Bir hərəkətin saniyədə 5 dəfə yerinə yetirilməsi üçün hərəkətin yerinə yetirilmə vaxtı + fasilə 200 ms-a bərabər olmalıdır. Beləliklə, o, həqiqətən də saniyədə 5 dəfə icra olunacaq. Bizim vəziyyətimizdə hərəkət 100 ms icra edilir, yəni fasilə üçün 100 ms qalır.
fasilə uzunluğu = bir dövrün uzunluğu — hərəkətin yerinə yetirilmə vaxtı
Bu hərəkətin yerinə yetirilmə vaxtı sıfırdan çox yüksək olduğunu oyun proqramçıları yaxşı başa düşür. Oyunu oynayan insanlar da həmçinin.
Əgər oyunun 20 FPS-i varsa, bu o deməkdir ki, bir saniyə ərzində o, ekranda cəmi 20 kadr çəkməyə nail olur. 1000/20
— 50 ms alırıq. Oyunun kadrının çəkilməsi vaxtı məhz bu qədərdir.
3. Nanosekundlar
Müasir kompüterlər, Java yaradıldığı vaxtlardan daha sürətlidirlər. Buna görə 1 millisekundluq fasilə artıq kifayət etməyə bilər.
Güman edək ki, biz çox sürətli bir əməliyyat həyata keçiririk və bunun saniyədə 2000 dəfə icra olunmasını istəyirik. Fasiləni necə yarım millisekund təşkil edə bilərik?
Bu məqsədlə Thread.sleep() metodunun başqa bir modifikasiyası mövcuddur:
Thread.sleep(millisekundlar, nanosekundlar);
Bu metod proqramı göstərilən millisekund və nanosekund müddətinə dayandırır.
Nanosekundlar — bu, millisekundların 1 milyonda bir hissəsidir. Buna görə bir yarım millisekund fasilə belə görünəcək:
Thread.sleep(1, 500_000);
Əgər siz 1/10
millisekund fasilə etmək istəyirsinizsə, belə yazmalısınız:
Thread.sleep(0, 100_000);
Bəlkə, hazırda bu metodu öz proqramlarınızda istifadə etməyəcəksiniz. Amma onun mövcud olduğunu bilmək və istifadə etməmək, ona ehtiyac duymaq və mövcudluğunu bilməməkdən yaxşıdır.
4. TimeUnit
sinfi
Bu arada, əgər tətbiqinizi daha yavaş etmək istəsəniz, həyatınızı asanlaşdıracaq başqa bir sinf də var — java.util.concurrent
paketindəki TimeUnit
sinfi.
Və yadda saxlayın ki, əgər sinfin paketi java.lang
deyilsə, ya import java.util.concurrent.TimeUnit;
sətrini əlavə etməli, ya da kodda hər dəfə java.util.concurrent.TimeUnit
yazmalısınız.
Bu sinif Thread.sleep()
ilə eyni işi görür, sadəcə daha rahatdır:
TimeUnit.HOURS.sleep(15)
Bu kod proqramınızı 15 saatlıq "yatızdıracaq". Həmçinin dəqiqələr, saniyələr, günlər də mövcuddur. Hətta — mikrosaniyələr (1/1000,000) və nanosaniyələr (1/1000,000,000) mövcuddur.
TimeUnit
sinfinin aşağıdakı xüsusiyyətləri var:
- nanosaniyələr:
NANOSECONDS
- mikrosaniyələr:
MICROSECONDS
- millisaniyələr:
MILLISECONDS
- saniyələr:
SECONDS
- dəqiqələr:
MINUTES
- saatlar:
HOURS
- günlər:
DAYS
Bu xüsusiyyətlər ilə işləmək çox rahatdır: məsələn, saatları millisaniyələrə çevirmək barədə düşünmək lazım deyil. Belə kodu həm yazmaq, həm də oxumaq daha xoşdur.
Ətraflı məlumatı buradan oxuya bilərsiniz.
GO TO FULL VERSION