App Programming/JAVA2008.12.03 13:45
출처:http://jakarta.tistory.com/37


Thread Pool

back

Contents

  1. Block Queue
  2. Thread Pool


일반적인 Thread Pool은 작업스레드를 계속해서 풀에 넣으면 갯수가 한정되어 있는 일할스레드가 풀을 검사하여 작업스레드가 존재하면 꺼내어서 실행한 후 다음 작업스레드가 풀에 생길 때까지 기다린다. 다시 작업스레드를 풀에 넣으면 기다리고 있던 일할스레드가 깨어나 풀에서 작업스레드를 꺼내어 실행함을 반복한다.

아래서 설명할 Thread Pool은 작업에 필요한 데이터를 풀에 계속해서 넣으면 객수가 한정되어 있는 일할스레드가 풀을 검사하여 데이터가 존재하면 꺼내서 실행한 후 다음 데이터가 발생할 때까지 기다린다. 풀은 데이터가 존재하지 않을 때 일할스레드를 기다리게 하며 데이터가 풀에 생길 때 기다리고 있던 스레드를 깨운다.

차이점이라고 한다면 풀에 들어가는 형태가 다르다고 할 수 있다. 일반적인 스레드 풀의 경우에는 어떤 작업 스레드가 풀에 들어오더라도 변경되는 부분이 없지만 아래의 스레드 풀은 풀에 데이터가 직접 전달되기 때문에 데이터의 종류만큼의 일할 스레드를 구현해야 한다.

 

1. Block Queue

Block Queue는 첫 번째 thread가 비어 있는 큐로부터 dequeue하려고 하면 두 번째 thread가 큐에 데이터를 enqueue할 때까지 블록된다. 큐는 LinkedList로 구현된다.

 

import java.uti.*;

public class BlockQueue
{
     private LinkedList queue = new LinkedList();

     public BlockQueue()
     {
     }

     public synchronized final void enqueue( Object data ) throws IllegalMonitorStateException
     {
          queue.addList( data );
          notify();
     }

     public synchronized final Object dequeue() throws InterruptedException
     {
           while( queue.size() <= 0 )
           {
                 wait();
           }
           return queue.removeFirst();
      }

     public synchronized final boolean isEmpty()
     {
          return queue.size() > 0;
     }

     public synchronized void close() throws IllegalMonitorStateException
     {
          notifyAll();
     }
}

 

 

2. Thread Pool

Thread Pool은 멤버 변수로써 Block Queue를 가지며 데이터를 처리하기 위한 Thread를 inner class로 선언하고 있다. 특히 Thread Pool은 외부에서 큐에게 데이터를 넣을 수 있는 Method를 제공하고 있다.

 

public class ThreadPool extends ThreadGroup
{
     private BlockQueue qu = new BlockQueue();
     private boolean closed = false;
     private int threadSize = 0 ;

 

     private class MyThread extends Thread
     {
          public MyThread()
          {
          }

          public void run()
          {
               try
               {
                     while( !closed )
                     {
                          Object date = qu.dequeue();

                          /*
                              풀에서 꺼낸 데이터를 처리할 부분
                          */

                      }
                }
                catch( InterruptedException e )
                {
                }
          }
     }

 

     public ThreadPool() {}

     public void makePool( int size )
     {
          for( int i=0; i<size; i++ )
          {
                new MyThread().start();
          }
     }

     public void addData( Object data )
     {
          try
          {
               qu.enqueue( data );
           }
           catch( IllegalMonitorStateException e )
           {
           }
     }

     public void close()
     {
          closed = true;
          qu.close();
     }
}

 



Posted by BAGE