Threads in java || Java-da Thread-lar

Java-da thread eyni vaxtda icra vahididir. Çağırılan metodlar, onların arqumentləri və lokal dəyişənlər üçün öz çağırış yığını var. Hər bir proqramda ən azı bir thread var, əsas thread, proqram işə salındıqda JVM (Java Virtual Machine) tərəfindən yaradılır. Əsas thread ilə eyni vaxtda kodu işlətmək üçün əlavə thread-lar yarada bilərsiniz.

Yeni başlıq yaratmaq üçün ya Thread class-nı extends edib onun run() metodunu override edərek əlavə etmək, ya da class-ın yeni Thread-in   instance-nı yarada və ona  Runnable object  ötürə bilərsiniz. Sonuncu yanaşmadan istifadə edərək yeni başlıq yaradılma və başladılma nümunəsi:


public class MyThread implements Runnable { public void run() { // code to run in the new thread } } // ... MyThread thread = new MyThread(); Thread t = new Thread(thread); t.start();


Bir thread işə salındıqdan sonra, o, tətbiqdəki digər thread-ləri eyni vaxtda icra edilə bilər. Müəyyən edilmiş millisaniyələr üçün thread-i dayandırmaq üçün sleep() method-dan və ya davam etməzdən əvvəl mövzunun bitməsini gözləmək üçün join() method-dan istifadə edə bilərsiniz .

Java-da thread-lə işləmək üçün thread-in prioritetini təyin etmək və ya paylaşılan məlumatları qorumaq üçün synchronization  (sinxronizasiyadan) istifadə etmək kimi daha bir çox üsul və seçim var. 


Thread synchronization  (sinxronizasiyası) iki və ya daha çox paralel thread-in "critical section"(kritik bölmə) kimi tanınan xüsusi proqram bölməsini eyni vaxtda icra etməməsini təmin etmək prosesidir. Bu zəruridir, çünki paylaşılan resurslara eyni vaxtda giriş race condition (yarış şəraitinə ) və digər synchronization ( sinxronizasiya) problemlərinə səbəb ola bilər.

Java-da siz paylaşılan resurslara girişi sinxronlaşdırmaq üçün synchronized açar sözündən və monitorlardan istifadə edə bilərsiniz.

Java-da paylaşılan mənbəyə girişi sinxronlaşdırmaq üçün synchronized açar sözündən necə istifadə edə biləcəyiniz üçün nümunə :


public class Counter { private int count = 0; public synchronized void increment() { count++; } public synchronized int getCount() { return count; } } public class Main { public static void main(String[] args) { Counter counter = new Counter(); Thread t1 = new Thread(() -> { for (int i = 0; i < 1000; i++) { counter.increment(); } }); Thread t2 = new Thread(() -> { for (int i = 0; i < 1000; i++) { counter.increment(); } }); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(counter.getCount()); } }


Bu misalda Counter class-ın paylaşılan resursu ( count field) və paylaşılan mənbəyə daxil olmaq üçün iki üsul ( increment() getCount()) var. Method increment()getCount() method həm synchronized açar sözlə qeyd olunur, bu da onları "critical section" (kritik bölmələr) edir. Bu, eyni anda bu üsullardan hər hansı birini yalnız bir thread-ın icra edə biləcəyini və count field atomik olaraq yenilənməsini təmin edir.

Əsas proqram eyni vaxtda count field-i artıran iki thread yaradır. Method sinxronlaşdırıldığı increment() üçün onu eyni anda yalnız bir thread yerinə yetirə bilər və count field təhlükəsiz şəkildə yenilənir. Hər iki thread tamamlandıqda count field-in son dəyəri çap olunur.

synchronized açar sözünə əlavə olaraq , Java həmçinin lock-lar, atomik dəyişənləri və java.util.concurrent paket kimi thread sinxronizasiyası üçün digər mexanizmləri də təmin edir.


Hiç yorum yok:

Yorum Gönder

Smart Presta spcookieslaw