Boa tarde e feliz ano novo! Ajude-me a entender um pouco mais sobre multithreading, ou seja, ThreadGroup. Pesquisei no Google, li e entendi a essência principal: o propósito é segurança, gestão integrada através da organização de um grupo.
Os threads são agrupados em grupos de threads por motivos de gerenciamento e segurança. Um grupo de threads pode pertencer a outro grupo, formando uma hierarquia com o grupo principal (sistema) no nível superior. Threads pertencentes a um grupo podem ser controlados ao mesmo tempo - você tem o direito de interromper o trabalho de todos os threads do grupo de uma vez ou definir um único valor máximo de prioridade de execução para eles. Grupos de threads também podem ser usados para definir domínios de segurança. Threads dentro de um grupo geralmente são dotados da possibilidade de influência mútua, que também se estende a threads de grupos aninhados. Quando dizemos “influência”, queremos dizer que qualquer chamada de método pode afetar o comportamento do thread, por exemplo, alterar sua prioridade ou causar uma interrupção.(fonte: Tyts )
Para evitar que um único thread pare e interrompa todos os threads consecutivos, foi introduzido o conceito de grupo. Um thread só pode influenciar threads que estejam no mesmo grupo que ele. Um grupo de threads é representado pela classe ThreadGroup. Esta organização permite proteger os fluxos de influências externas indesejadas. Um grupo de threads pode conter outros grupos, permitindo que todos os threads e grupos sejam organizados em uma árvore hierárquica na qual cada objeto ThreadGroup, exceto o raiz, possui um pai.(fonte: Tyts ) Depois de ler vários artigos, decidi escrever um pequeno código no qual não seria capaz de interromper os fluxos de outro grupo de um thread de um grupo. E algo não deu certo: me permite interromper((( Meu código: Por que é possível interromper? Aqui está o resultado:
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