>  기사  >  Java  >  Java에서 스레드 그룹을 사용하는 예 및 방법

Java에서 스레드 그룹을 사용하는 예 및 방법

WBOY
WBOY앞으로
2023-04-21 23:10:171423검색

Java의 스레드 그룹(ThreadGroup 클래스)

ThreadGroup 클래스는 Java에서 스레드 컬렉션을 나타내는 스레드 그룹을 나타내는 데 사용되며 스레드 및 스레드 그룹 일괄 처리를 관리할 수 있습니다. 스레드는 특정 스레드 그룹에 할당될 수 있으며 스레드 그룹에 스레드 개체가 있을 수도 있고 그룹에 스레드가 있을 수도 있습니다. 이 조직 구조는 트리 형태와 다소 유사합니다. 그림에 표시된 것처럼.

Java에서 스레드 그룹을 사용하는 예 및 방법

사용자가 생성한 모든 스레드는 지정된 스레드 그룹에 속합니다. 스레드 그룹이 명시적으로 지정되지 않은 경우 스레드는 기본 스레드 그룹(즉, 기본 스레드 그룹)에 속합니다. 기본적으로 하위 스레드와 상위 스레드는 동일한 스레드 그룹에 있습니다.

또한, 스레드가 속한 스레드 그룹은 스레드가 생성될 때만 지정할 수 있으며, 스레드가 실행되는 동안에는 스레드 그룹을 변경할 수 없습니다. 일단 지정되면 변경됩니다.

2. 스레드 그룹을 사용하는 이유

1.안전

동일한 스레드 그룹의 스레드는 서로의 데이터를 수정할 수 있습니다. 그러나 서로 다른 스레드 그룹에 있는 경우 데이터는 "교차 스레드 그룹"으로 수정될 수 없으며 데이터 보안은 어느 정도 보장될 수 있습니다.

2. 일괄관리

스레드 또는 스레드 그룹 개체를 일괄적으로 관리하여 스레드 또는 스레드 그룹 개체를 효과적으로 구성하거나 제어할 수 있습니다.

3. 스레드 그룹 사용 예시

1. 스레드 연관 스레드 그룹: 1차 연관

소위 첫 번째 수준 연결은 상위 개체에 하위 개체가 있지만 손자 개체가 생성되지 않음을 의미합니다. 예를 들어, 스레드 그룹을 생성한 후 생성된 스레드를 그룹에 할당하면 이러한 스레드를 효과적으로 관리할 수 있습니다. 코드 예시는 다음과 같습니다:

public class ThreadGroupTest {
 public static void main(String[] args) {
 ThreadGroup rootThreadGroup = new ThreadGroup("root线程组");
 Thread thread0 = new Thread(rootThreadGroup, new MRunnable(), "线程A");
 Thread thread1 = new Thread(rootThreadGroup, new MRunnable(), "线程B");
 thread0.start();
 thread1.start();
 }
}
class MRunnable implements Runnable {
 @Override
 public void run() {
 while (!Thread.currentThread().isInterrupted()) {
 System.out.println("线程名: " + Thread.currentThread().getName() 
+ ", 所在线程组: " + Thread.currentThread().getThreadGroup().getName()) ;
 try {
 Thread.sleep(1000);
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
 }
 }
}
复制代码

실행 결과는 다음과 같습니다.

线程名: 线程A, 所在线程组: root线程组
线程名: 线程B, 所在线程组: root线程组
复制代码

2. 스레드 연관 스레드 그룹: 다단계 연관

소위 다단계 연관이란 상위 개체에 하위 개체가 있고 하위 개체에 손자 개체를 생성하면 자손 효과가 있음을 의미합니다. 예를 들어, 아래 그림의 두 번째 구성 방법을 사용하여 하위 스레드 그룹을 특정 스레드 그룹에 귀속시킨 다음 생성된 스레드를 하위 스레드 그룹에 귀속시키면 스레드 트리 효과가 나타납니다.

Java에서 스레드 그룹을 사용하는 예 및 방법

코드 예시는 다음과 같습니다:

public class ThreadGroupTest {
 public static void main(String[] args) {
 ThreadGroup rootThreadGroup = new ThreadGroup("root线程组");
 Thread thread0 = new Thread(rootThreadGroup, new MRunnable(), "线程A");
 Thread thread1 = new Thread(rootThreadGroup, new MRunnable(), "线程B");
 thread0.start();
 thread1.start();
 ThreadGroup threadGroup1 = new ThreadGroup(rootThreadGroup, "子线程组");
 Thread thread2 = new Thread(threadGroup1, new MRunnable(), "线程C");
 Thread thread3 = new Thread(threadGroup1, new MRunnable(), "线程D");
 thread2.start();
 thread3.start();
 }
}
class MRunnable implements Runnable {
 @Override
 public void run() {
 while (!Thread.currentThread().isInterrupted()) {
 System.out.println("线程名: " + Thread.currentThread().getName()
 + ", 所在线程组: " + Thread.currentThread().getThreadGroup().getName()
 + ", 父线程组: " + Thread.currentThread().getThreadGroup().getParent().getName());
 try {
 Thread.sleep(1000);
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
 }
 }
}
复制代码

실행 결과는 다음과 같습니다.

线程名: 线程A, 所在线程组: root线程组, 父线程组: main
线程名: 线程B, 所在线程组: root线程组, 父线程组: main
线程名: 线程C, 所在线程组: 子线程组, 父线程组: root线程组
线程名: 线程D, 所在线程组: 子线程组, 父线程组: root线程组
复制代码

3. 그룹 내 스레드 일괄 관리

당연히 스레드 그룹을 사용하려면 스레드의 일괄 관리가 필요합니다. 예를 들어 그룹 내 스레드를 일괄적으로 인터럽트할 수 있습니다.

public class ThreadGroupTest {
 public static void main(String[] args) {
 ThreadGroup rootThreadGroup = new ThreadGroup("root线程组");
 Thread thread0 = new Thread(rootThreadGroup, new MRunnable(), "线程A");
 Thread thread1 = new Thread(rootThreadGroup, new MRunnable(), "线程B");
 thread0.start();
 thread1.start();
 ThreadGroup threadGroup1 = new ThreadGroup(rootThreadGroup, "子线程组");
 Thread thread2 = new Thread(threadGroup1, new MRunnable(), "线程C");
 Thread thread3 = new Thread(threadGroup1, new MRunnable(), "线程D");
 thread2.start();
 thread3.start();
 rootThreadGroup.interrupt();
 System.out.println("批量中断组内线程");
 }
}
class MRunnable implements Runnable {
 @Override
 public void run() {
 while (!Thread.currentThread().isInterrupted()) {
 System.out.println("线程名: " + Thread.currentThread().getName()
 + ", 所在线程组: " + Thread.currentThread().getThreadGroup().getName()
 + ", 父线程组: " + Thread.currentThread().getThreadGroup().getParent().getName());
 try {
 Thread.sleep(1000);
 } catch (InterruptedException e) {
 e.printStackTrace();
 break;
 }
 }
 System.out.println(Thread.currentThread().getName() + "执行结束");
 }
}
复制代码

실행 결과는 다음과 같습니다.

线程名: 线程A, 所在线程组: root线程组, 父线程组: main
线程名: 线程B, 所在线程组: root线程组, 父线程组: main
线程名: 线程C, 所在线程组: 子线程组, 父线程组: root线程组
线程名: 线程D, 所在线程组: 子线程组, 父线程组: root线程组
批量中断组内线程
线程A执行结束
线程B执行结束
线程C执行结束
线程D执行结束
复制代码

위 내용은 Java에서 스레드 그룹을 사용하는 예 및 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제