Sistem dizaynı ilə bağlı müsahibə sualları o qədər açıq ola bilər ki, düzgün hazırlaşmağı bilmək çox çətindir. İndi satın aldıqdan sonra Amazon, Microsoft və Adobe-nin dizayn dövrlərini sındıra bilirəm Bu kitabı. Gündəlik bir yenidən nəzərdən keçirin dizayn sualı və söz verirəm ki, dizayn dövrünü sındıra bilərsiniz.
Mündəricat
Java-da ThreadGroup
Java-dakı bir ThreadGroup bir qrupu təmsil edir mövzuları və ya mövzu qruplarına aiddir java.lang.ThreadGroup
sinif. Bir mövzu qrupunun əsas üstünlüyü ondan ibarətdir ki, tək bir funksiya çağırışı istifadə edərək bütün mövzuları dayandırmaq, davam etdirmək və ya dayandırmaq kimi əməliyyatlar edə bilərik. Bir mövzu qrupundakı hər bir mövzuda ilkin iplik xaricində bir ana ip var və bu səbəbdən bir ağac quruluşunu təmsil edir. Öz mövzu qrupu haqqında bütün məlumatlara daxil ola bilər. ThreadGroup sinfi eyni əməliyyatı bir neçə mövzuda yerinə yetirmək istədiyimiz zaman çox faydalıdır.
ThreadGroupun qurucuları
Aşağıda Java-da inşaatçılar Mövzu Qrupu.
konstruktor | təsvir |
---|---|
ThreadGroup (Simli ad) | Göstərilən adla bir mövzu qrupu yaradır |
ThreadGroup (ThreadGroup valideyn, String adı) | Göstərilən mövzu qrupu valideyn və adı ilə bir mövzu qrupu yaradır |
ThreadGroup metodları
Java-dakı ThreadGroup sinfi müxtəlif əməliyyatları yerinə yetirmək üçün aşağıdakı metodlara malikdir.
Üsul | təsvir |
---|---|
int activeCount () | Thread qrupundakı aktiv mövzu sayını qaytarır |
int activeGroupCount () | Göstərilən qrupdakı aktiv mövzu qruplarının sayını qaytarır |
void checkAccess () | Mövcud mövzuda qrupların girişini dəyişdirmək üçün icazənin olub olmadığını yoxlayır |
ləğv etmək () | Mövzu qrupunu məhv edir |
int enumerate (Mövzu [] siyahısı) | Mövzu qrupundakı hər bir cərgəni göstərilən massivə kopyalayır |
int saymaq (ThreadGroup [] siyahısı) | Mövzu qrupundakı hər aktiv alt qrupu göstərilən massivə kopyalayır |
int sadalamaq (Mövzu [] siyahısı, boolean recurse) | Mövzu qrupundakı hər bir cərgəni göstərilən massivə kopyalayır. Təkrarlanma doğrudursa, bu əməliyyatı rekursiv olaraq çağırır |
int saymaq (ThreadGroup [] siyahısı, boolean recurse) | Mövzu qrupundakı hər aktiv alt qrupu göstərilən massivə kopyalayır. Təkrarlanma doğrudursa, bu əməliyyatı rekursiv olaraq çağırır |
int getMaximumPriority () | Mövzu qrupunun maksimum prioritetini qaytarır |
String getName () | Mövzu qrupunun adını qaytarır |
ThreadGroup getParent () | Mövzu qrupunun əsasını qaytarır |
boşluq kəsmək () | Mövzu qrupundakı bütün ipləri kəsir |
boolean isDaemon () | Mövzu qrupunun demon olub olmadığını yoxlayır |
boolean məhv edilmişdir () | Mövzu qrupunun məhv olub-olmadığını yoxlayır |
boş siyahı () | Mövzu qrupu haqqında məlumatları standart çıxış axınına çap edir |
boolean parentOf (ThreadGroup tg) | Mövzu qrupunun göstərilən mövzu qrupu arqumenti və ya onun əcdad mövzu qrupları olub olmadığını yoxlayır |
etibarsız setDaemon (boolean daemon) | Mövzu qrupunun demon vəziyyətini təyin edir |
etibarsız setMaxPriority (int p) | Mövzu qrupu üçün göstərilən maksimum prioriteti təyin edir |
Java ThreadGroup metodlarına nümunə:
Bu nümunə, Java-da ThreadGroup sinifinin müxtəlif metodlarından necə istifadə olunacağını göstərir. Qrup1-in Qrup2-nin ana hissəsi olduğu “Qrup1” və “Qrup2” adlı iki ThreadGroup yaratdıq. Aktiv mövzuların sayını almaq üçün istifadə edirik activeCount()
üsulu və aktiv mövzu qruplarının sayını almaq üçün istifadə edə bilərik activeGroupCount()
metod. GetMaxPriority () maksimumu qaytarır mövcud mövzuların prioriteti. Bu getName()
mövzu qrupunun adını alır. Bir mövzu qrupunun, istifadə edərək başqa bir qrupun ana olub olmadığını da yoxlaya bilərik parentOf()
metodunu istifadə edin və getParent()
metod. The checkAccess()
metod, mövzu qruplarının qrup məlumatlarını almaq üçün lazımi icazələrin olub olmadığını yoxlayır. Nəhayət, istifadə edərək mövzu qrupundakı bütün mövzuları sadalaya bilərik list()
metodu.
public class ThreadGroupDemo extends Thread { public ThreadGroupDemo(String name, ThreadGroup tg) { super(tg,name); } public void run() { System.out.println("Running " + Thread.currentThread().getName()); } public static void main(String[] args) { ThreadGroup tg = new ThreadGroup("Group1"); ThreadGroup tg1 = new ThreadGroup(tg, "Group2"); ThreadGroupDemo t1 = new ThreadGroupDemo("Thread1", tg); ThreadGroupDemo t2 = new ThreadGroupDemo("Thread2", tg); ThreadGroupDemo t3 = new ThreadGroupDemo("Thread3", tg1); t1.start(); t2.start(); t3.start(); System.out.println("Number of active threads: " + tg.activeCount()); System.out.println("Number of active thread groups: " + tg.activeGroupCount()); System.out.println("Maximum priority: " + tg.getMaxPriority()); System.out.println("Thread group name: " + tg.getName()); System.out.println("Child thread group name: "+ tg1.getName()); System.out.println(tg.parentOf(tg1)); System.out.println("Parent thread group: " + tg1.getParent()); tg.checkAccess(); System.out.println(tg.getName() + " has access"); tg1.checkAccess(); System.out.println(tg1.getName() + " has access"); System.out.println("List the information of thread group using the list method: "); tg.list(); } }
Running Thread3 Running Thread2 Number of active threads: 3 Running Thread1 Number of active thread groups: 1 Maximum priority: 10 Thread group name: Group1 Child thread group name: Group2 true Parent thread group: java.lang.ThreadGroup[name=Group1,maxpri=10] Group1 has access Group2 has access List the information of thread group using the list method: java.lang.ThreadGroup[name=Group1,maxpri=10] java.lang.ThreadGroup[name=Group2,maxpri=10]
Misal: destroy () metodu - Java ThreadGroup
Bu nümunə Java-da bir mövzu qrupunu destroy()
üsulu istifadə edərək məhv olub olmadığını yoxlayın isDestroyed()
metod. Mövzu qrupunu məhv etməzdən əvvəl mövzuların icrası başa çatana qədər gözləməliyik, əks halda bir InterruptException atacaq. Bunun üçün join()
Mövzu sinifinin metodu.
public class ThreadGroupEx extends Thread{ public ThreadGroupEx(ThreadGroup tg, String name) { super(tg,name); } public void run() { System.out.println(Thread.currentThread().getName() + " is running"); } public static void main(String[] args) throws InterruptedException { ThreadGroup tg = new ThreadGroup("Group1"); ThreadGroupEx t1 = new ThreadGroupEx(tg, "Thread1"); ThreadGroupEx t2 = new ThreadGroupEx(tg, "Thread2"); t1.start(); t2.start(); t1.join(); t2.join(); tg.destroy(); System.out.println(tg.getName() + " destroyed"); System.out.println("Is thread group destroyed: " + tg.isDestroyed()); } }
Thread2 is running Thread1 is running Group1 destroyed Is thread group destroyed: true
Nümunə: interrupt () metodu - Java ThreadGroup
Bu, istifadə edərək bir mövzu qrupunu kəsməyə bir nümunədir interrupt()
metodu.
public class InterruptThread extends Thread{ public InterruptThread(ThreadGroup tg, String name) { super(tg,name); } public void run() { System.out.println(Thread.currentThread().getName() + " is running"); } public static void main(String[] args) { ThreadGroup tg = new ThreadGroup("Group1"); InterruptThread t1 = new InterruptThread(tg,"Thread1"); t1.start(); t1.interrupt(); System.out.println(tg.getName() + " interrupted"); } }
Group1 interrupted Thread1 is running
Misal: enumerate () metodu - Java ThreadGroup
Bu nümunədə mövzuları bir -ə necə kopyalayacağımızı görə bilərik array sadalamaq () metodundan istifadə etməklə. Burada 2 mövzu yaradırıq və onları massivə köçürürük və for loop istifadə edərək mövzu adlarını çap edirik.
public class EnumerateThreadDemo extends Thread { public EnumerateThreadDemo(ThreadGroup tg, String name) { super(tg, name); } public void run() { System.out.println(Thread.currentThread().getName() + " is running"); } public static void main(String[] args) { ThreadGroup tg = new ThreadGroup("Group1"); EnumerateThreadDemo t1 = new EnumerateThreadDemo(tg, "Thread1"); EnumerateThreadDemo t2 = new EnumerateThreadDemo(tg, "Thread2"); t1.start(); t2.start(); Thread[] tarr = new Thread[tg.activeCount()]; int cnt = tg.enumerate(tarr); for(int i=0;i<cnt;i++) System.out.println(tarr[i].getName()); } }
Thread1 Thread2 Thread1 is running Thread2 is running
Aşağıda başqa bir nümunə var enumerate()
üsulu təyin etdiyimiz zaman resurse parametr doğrudur. Bu vəziyyətdə, uşaq iplik qrupları vasitəsilə də müraciət edir. Həm də ipi3 yazdırmasının səbəbi budur.
public class EnumerateThreadDemo extends Thread { public EnumerateThreadDemo(ThreadGroup tg, String name) { super(tg, name); } public void run() { System.out.println(Thread.currentThread().getName() + " is running"); } public static void main(String[] args) { ThreadGroup tg = new ThreadGroup("Group1"); ThreadGroup tg1 = new ThreadGroup(tg,"Group2"); EnumerateThreadDemo t1 = new EnumerateThreadDemo(tg, "Thread1"); EnumerateThreadDemo t2 = new EnumerateThreadDemo(tg, "Thread2"); EnumerateThreadDemo t3 = new EnumerateThreadDemo(tg1, "Thread3"); t1.start(); t2.start(); t3.start(); Thread[] tarr = new Thread[tg.activeCount()]; int cnt = tg.enumerate(tarr, true); for(int i=0;i<cnt;i++) System.out.println(tarr[i].getName()); } }
Thread1 Thread2 Thread3 Thread1 is running Thread2 is running Thread3 is running
Biz də istifadə edə bilərik enumerate()
Aşağıdakı nümunədə gördüyümüz kimi mövzu qruplarını bir massivə kopyalamaq metodu. Bu vəziyyətdə, uşaq iplik qruplarını bir sıra halına gətirir.
public class EnumerateThreadDemo extends Thread { public EnumerateThreadDemo(ThreadGroup tg, String name) { super(tg, name); } public void run() { System.out.println(Thread.currentThread().getName() + " is running"); } public static void main(String[] args) { ThreadGroup tg = new ThreadGroup("Group1"); ThreadGroup tg1 = new ThreadGroup(tg,"Group2"); EnumerateThreadDemo t1 = new EnumerateThreadDemo(tg, "Thread1"); EnumerateThreadDemo t2 = new EnumerateThreadDemo(tg, "Thread2"); EnumerateThreadDemo t3 = new EnumerateThreadDemo(tg1, "Thread3"); t1.start(); t2.start(); t3.start(); ThreadGroup[] tgarr = new ThreadGroup[tg.activeCount()]; int cnt = tg.enumerate(tgarr,true); for(int i=0;i<cnt;i++) System.out.println(tgarr[i].getName()); } }
Group2 Thread3 is running Thread1 is running Thread2 is running
