자바 가 스 레 드 탱크 를 만 드 는 두 가지 다른 방법의 비교

자바 로 캡 처 를 할 때 다 중 스 레 드 를 사용 하 는 것 을 피 할 수 없습니다.여러 사이트 나 한 스 레 드 를 동시에 캡 처 하여 한 사 이 트 를 캡 처 하려 면 너무 느 리 고 한 스 레 드 가 같은 사 이 트 를 캡 처 하면 CPU 자원 을 낭비 하기 때 문 입 니 다.다 중 스 레 드 등 을 사용 하려 면 스 레 드 에 대한 제어 나 스 레 드 풀 을 사용 하 는 것 을 피 할 수 없다.   제 가 현재 캡 처 프레임 워 크 를 만 들 때 자바 util.concurrent.ExecutorService 를 스 레 드 풀 로 사용 한 적 이 있 습 니 다.ExecutorService 에 대한 사용 코드 는 다음 과 같 습 니 다.
java.util.concurrent.Executors 류 의 API 는 연결 풀 을 대량으로 만 드 는 정적 방법 을 제공 합 니 다.
1.고정 크기 의 스 레 드 탱크:
package BackStage;
 
  import java.util.concurrent.Executors;
  import java.util.concurrent.ExecutorService;
 
  public class JavaThreadPool {
     public static void main(String[] args) {
         //                 
          ExecutorService pool = Executors.newFixedThreadPool(2);
         //      Runnable    ,Thread        Runnable  
         Thread t1 = new MyThread();
         Thread t2 = new MyThread();
         Thread t3 = new MyThread();
         Thread t4 = new MyThread();
         Thread t5 = new MyThread();
         //            
         pool.execute(t1);
         pool.execute(t2);
         pool.execute(t3);
         pool.execute(t4);
         pool.execute(t5);
         //      
         pool.shutdown();
     }
 }
 
 class MyThread extends Thread {
     @Override
     public void run() {
         System.out.println(Thread.currentThread().getName() + "    。。。");
     }
 }

나중에 Executor Service 의 기능 이 생각 보다 좋 지 않 고 스 레 드 용기 만 제공 하 는 것 을 발 견 했 습 니 다.그래서 나중에 저 는 자바.lang.ThreadGroup 을 사 용 했 습 니 다.ThreadGroup 은 많은 장점 을 가지 고 있 습 니 다.가장 중요 한 것 은 스 레 드 를 옮 겨 다 닐 수 있다 는 것 입 니 다.그 스 레 드 가 이미 실행 되 었 고 그 스 레 드 가 실행 되 고 있다 는 것 을 알 게 되 었 습 니 다.ThreadGroup 의 사용 코드 는 다음 과 같 습 니 다.
class MyThread extends Thread { boolean stopped; MyThread(ThreadGroup tg, String name) { super(tg, name); stopped = false; } public void run() { System.out.println(Thread.currentThread().getName() + " starting."); try { for (int i = 1; i < 1000; i++) { System.out.print("."); Thread.sleep(250); synchronized (this) { if (stopped) break; } } } catch (Exception exc) { System.out.println(Thread.currentThread().getName() + " interrupted."); } System.out.println(Thread.currentThread().getName() + " exiting."); } synchronized void myStop() { stopped = true; } } public class Main { public static void main(String args[]) throws Exception { ThreadGroup tg = new ThreadGroup("My Group"); MyThread thrd = new MyThread(tg, "MyThread #1"); MyThread thrd2 = new MyThread(tg, "MyThread #2"); MyThread thrd3 = new MyThread(tg, "MyThread #3"); thrd.start(); thrd2.start(); thrd3.start(); Thread.sleep(1000); System.out.println(tg.activeCount() + " threads in thread group."); Thread thrds[] = new Thread[tg.activeCount()]; tg.enumerate(thrds); for (Thread t : thrds) System.out.println(t.getName()); thrd.myStop(); Thread.sleep(1000); System.out.println(tg.activeCount() + " threads in tg."); tg.interrupt(); } }

 상기 코드 를 통 해 알 수 있 듯 이 ThreadGroup 은 Executor Service 보다 다음 과 같은 몇 가지 장점 이 많 습 니 다.  
1.ThreadGroup 은 스 레 드 를 옮 겨 다 닐 수 있 습 니 다.스 레 드 가 이미 실행 되 었 고 실행 중인 것 을 알 수 있 습 니 다.  
2.ThreadGroup.activeCount 를 통 해 얼마나 많은 스 레 드 가 있 는 지 알 수 있 고 삽 입 된 스 레 드 수 를 제어 할 수 있 습 니 다.
이 글 은 블 로그 원 에서 왔 습 니 다.http://www.cnblogs.com/yy2011/archive/2011/05/05/2037564.html

좋은 웹페이지 즐겨찾기