Mündəricat
Java-da inter mövzu
Java-da və ya əməkdaşlıq sinxronizasiya olunmuş ünsiyyətin əlaqələndirilməsi prosesidir mövzuları. Bu o deməkdir ki, yeni bir mövzu kritik hissəyə daxil olmaq istədikdə, yeni iş parçasına icazə vermək üçün hazırda icra olunan ipliyi dayandırır. Bu şəkildə, sinxronlaşdırılmış iplər bir-biri ilə iş birliyi edərsə, çıxılmaz vəziyyət riskini azaldır. Objekt sinifinin wait, notify və notifyAll metodlarından istifadə edərək mövzuarası ünsiyyəti həyata keçirə bilərik.
İndi hər bir metodu aşağıda ətraflı şəkildə nəzərdən keçirək.
gözləmə metodu
Wait () metodu cari mövzu icrasını dayandırır və vaxt keçdikcə gözləyir və ya başqa bir mövzu notify () və ya notifyAll () metodunu çağırır.
Wait () metoduna yalnız daxilində müraciət edə bilərik sinxronizasiya olunmuş metod və ya sinxronizasiya edilmiş blok, çünki iplik monitora sahib olmalıdır, əks halda istisna verəcəkdir. Wait () metodunu çağırdıqdan sonra mövcud kilid monitorunu buraxır.
public final void wait(long milliseconds) throws InterruptedException
Monitor nədir
Sinxronlaşdırılmış bir mövzu paylaşılan bir mənbəyə daxil olmaq istədikdə, bir kilid əldə edir və monitora daxil olur. Bir anda yalnız bir mövzu monitora sahib ola bilər. Digər mövzuların, ilk mövzu monitoru buraxana qədər gözləmək lazımdır.
metodu bildir
Bildiriş metodu eyni mənbədə gözləmə metodunu çağıran ipi oyandırır. Bu, yuxuda olan ipin icrasını davam etdirməsinə səbəb olur. Eyni paylaşılan mənbənin gözləmə vəziyyətində çox sayda mövzu varsa, bunlardan heç birini xəbərdar edir.
public final void notify()
bütün metod
NotifyAll metodu eyni mənbədə gözləmə metodunu çağıran bütün mövzuları oyadır. Birdən çox iplik varsa, ən yüksək yuxudan oyanır prioritet mövzu.
public final void notifyAll()
Java-da mövzuarası rabitə nümunəsi
Aşağıda java-da gözləmə, bildiriş və notifyAll metodlarından istifadə edərək mövzudaxili rabitəni necə tətbiq edəcəyinizi anlamağa kömək edən bir nümunə var.
class Stock { int qty = 15; synchronized void purchaseStock(int quantity) { System.out.println("Purchase stock"); if(this.qty < quantity) { System.out.println("Insufficient quantity available"); try { wait(); } catch(Exception e) { e.printStackTrace(); } } this.qty = this.qty - quantity; System.out.println("Purchase stock completed"); } synchronized void addStock(int quantity) { System.out.println("Adding Product stock"); this.qty = this.qty + quantity; System.out.println("Add stock completed"); notify(); } } public class InterThreadDemo { public static void main(String[] args) { Stock s = new Stock(); new Thread() { public void run() { s.purchaseStock(20); } }.start(); new Thread() { public void run() { s.addStock(10); } }.start(); } }
Purchase stock Insufficient quantity available Adding Product stock Add stock completed Purchase stock completed
Yuxarıdakı nümunəni ətraflı başa düşək.
İlk mövzu zəng etdikdə purchaseStock()
üsulu ilə kilidi əldə edir və stokda lazımlı miqdarın olub olmadığını yoxlayır. Tələb olunan miqdar (20 olan) mövcud miqdardan (15-dən) az olduğundan, çağırır wait()
metodu.
İndi kilidi buraxır və ilk iplik gözləmə vəziyyətində olduğundan ikinci ipliyi başlayır. İkinci mövzu mövcud stoka lazımi miqdarda əlavə edən və sonra çağıran addStock () metodunu çağırır notify()
metod. The notify()
üsulu çağıran ilk ipi oyandırır wait()
metod və icrasını davam etdirir.
İndi tələb olunan stok mövcud olduğu üçün tələb olunan miqdar azalır və mövcud stoku yeniləyir və icrası tamamlayır.
Gözləmə və yuxu arasındakı fərq
Gözləmə və yuxu metodları az və ya çox eyni əməliyyatı həyata keçirsə də, aşağıdakı kimi bəzi fərqlər var.
gözləmək | yatmaq |
---|---|
Obyekt sinfinə aiddir | Mövzu sinifinə aiddir |
Statik olmayan bir üsuldur | Statik bir üsuldur |
Gözləmə əməliyyatı bildirmək və ya bildirmək üçün bütün metodlarla dayandırılır | Yuxu əməliyyatı müəyyən bir fasilədən sonra kəsilir |
Gözləmə metodu çağırıldıqda kilidi buraxır | Heç bir kilidi buraxmır və ya sahibi deyil |