ظهر بخیر و سال نو مبارک! به من کمک کنید تا کمی بیشتر در مورد Multithreading، یعنی ThreadGroup، درک کنم. من در گوگل جستجو کردم، خواندم و ماهیت اصلی را فهمیدم: هدف امنیت، مدیریت یکپارچه از طریق سازماندهی یک گروه است.
موضوعات به دلایل مدیریت پذیری و امنیتی به گروه های رشته گروه بندی می شوند. یک گروه رشته می تواند به گروه دیگری تعلق داشته باشد و یک سلسله مراتب را با گروه اصلی (سیستم) در سطح بالا تشکیل دهد. موضوعات متعلق به یک گروه را می توان همزمان کنترل کرد - شما این حق را دارید که کار همه رشته های گروه را به طور همزمان قطع کنید یا یک مقدار حداکثر اولویت اجرا را برای آنها تعیین کنید. همچنین می توان از گروه های رشته برای تعریف دامنه های امنیتی استفاده کرد. رشتههای درون یک گروه معمولاً دارای امکان تأثیر متقابل هستند که به رشتههای گروههای تودرتو نیز گسترش مییابد. وقتی میگوییم «نفوذ»، منظور این است که هر فراخوانی متدی میتواند بر رفتار رشته تأثیر بگذارد، مثلاً اولویت آن را تغییر دهد یا باعث وقفه شود.(منبع: Tyts )
برای جلوگیری از متوقف شدن یک رشته و قطع تمام رشته ها در یک ردیف، مفهوم گروه معرفی شد. یک رشته فقط میتواند روی رشتههایی که در همان گروه هستند تأثیر بگذارد. یک گروه رشته با کلاس ThreadGroup نشان داده می شود. این سازمان به شما امکان می دهد از جریانات در برابر تأثیرات خارجی ناخواسته محافظت کنید. یک گروه رشته میتواند شامل گروههای دیگری باشد که به همه رشتهها و گروهها اجازه میدهد تا در یک درخت سلسله مراتبی سازماندهی شوند که در آن هر شی ThreadGroup، به جز یک ریشه، یک والد دارد.(منبع: Tyts ) پس از خواندن مقالات مختلف، تصمیم گرفتم یک کد کوچک بنویسم که در آن نتوانم جریان گروهی دیگر را از یک رشته از یک گروه قطع کنم. و چیزی درست نشد: به من اجازه می دهد که قطع کنم((( کد من: چرا ممکن است قطع شود؟ این خروجی است:
public class Test { public static ArrayList
threads = new ArrayList
(); public static ArrayList
groups = new ArrayList
(); public static void main(String[] args) throws InterruptedException { final ThreadGroup group1 = new ThreadGroup("GROUP 1"); final ThreadGroup group2 = new ThreadGroup("GROUP 2"); final ThreadGroup group3 = new ThreadGroup("GROUP 3"); groups.add(group1); groups.add(group2); groups.add(group3); for (int i = 0; i < groups.size(); i++) { for (int j = 1; j < 5; j++) { Thread thread = new Thread(groups.get(i), "THREAD №" + j) { @Override public void run() { while (!isInterrupted()) { try { Thread.sleep(500); } catch (InterruptedException e) { System.out.println(getName() + " : " + getThreadGroup().getName() + " прервана"); } } } }; threads.add(thread); thread.start(); } } Thread thread = new Thread(group1, "THREAD №5") { @Override public void run() { group2.interrupt(); while (true); } }; thread.start(); threads.add(thread); for (Thread t : threads) System.out.println(t); } }
Thread[THREAD №1,5,GROUP 1] Thread[THREAD №2,5,GROUP 1] Thread[THREAD №3,5,GROUP 1] Thread[THREAD №4,5,GROUP 1] Thread[THREAD №1,5,GROUP 2] Thread[THREAD №2,5,GROUP 2] Thread[THREAD №3,5,GROUP 2] Thread[THREAD №4,5,GROUP 2] Thread[THREAD №1,5,GROUP 3] Thread[THREAD №2,5,GROUP 3] Thread[THREAD №3,5,GROUP 3] Thread[THREAD №4,5,GROUP 3] Thread[THREAD №5,5,GROUP 1] THREAD №1 : GROUP 2 прервана THREAD №2 : GROUP 2 прервана THREAD №4 : GROUP 2 прервана THREAD №3 : GROUP 2 прервана
GO TO FULL VERSION