Java 다중 스레드WorkerThread 모드

3977 단어
일이 안 오면 계속 기다리고, 일이 오면 일을 한다.
예제 프로그램
  • Main 테스트 프로그램 동작의 클래스
  • ClientThread는 작업 요청을 보내는 스레드의 클래스
  • 를 나타냅니다.
  • Request는 작업 요청의 클래스를 나타냅니다
  • .
  • Channel에서 작업 요청을 받고 작업 요청을 일꾼 라인에 전달하는 클래스
  • WorkerThread는 일꾼 라인의 종류를 나타낸다
  • Main 클래스
    public class Main {
      public static void main (String[] args) {
        Channel channel = new Channel(5);   //       
        channel.startWorkers();
        new ClientThread("Alice", channel).start();
        new ClientThread("Bobby", channel).start();
        new ClientThread("Chris", channel).start();
      }
    }
    

    ClientThread 클래스
    import java.util.Random;
    
    public class ClientThread extends Thread {
      private final Channel channel;
      private static final Random random = new Random();
      public ClientThread(String name, Channel channel){
        super( name);
        this.channel = channel;
      }
      public void run() {
        try {
          for (int i = 0; true; i++) {
            Request request = new Request(getName(), i);
            channel.putRequest(request);
            Thread.sleep(random.nextInt(1000));
          }
        } catch (InterruptException e) {}
      }
    }
    

    Request 클래스
    import java.util.Random;
    
    public class Request {
      private final String name;
      private final int number;
      private static final Random random = new Random();
      public Request(String name, int number){
        this.name = name;
        this.number = number;
      }
      public void execute() {
        System.out.println(Thread.currentThread().getName() + " executes " + this );
        try {
          Thread.sleep(random.nextInt(1000));
        } catch (InterruptedException e) {}
      }
      public String toString() {
        return "[ Request from " + name + " No. " + number + " ]";
      }
    } 
    

    Channel 클래스
    public class Channel {
      private static final int MAX_REQUEST = 100;
      private final Request[]  requestQueue;
      private int tail ;    //  putRequest   
      private int head;  //  takeRequest   
      private int count ;  // Request     
      private final WorkerThread[]  threadPool;
      public Channel (int threads) {
        this.requestQueue = new Request[MAX_REQUEST];
        this.head = 0;
        this.tail = 0;
        this.count = 0;
    
        threadPool = new WorkerThread[threads];
        for (int i = 0; i < threadPool.length; i++){
          threadPool[i] = new WorkerThread("Worker-" + i , this);
        }
      }
    
      public void startWorkers() {
        for(int i = 0; i < threadPool.length; i++){
          threadPool[i].start();
        }
      }
      
      public synchronized void putRequest(Request request){
        while(count >= requestQueue.length){
          try {
            wait();
          } catch (InterruptedException e){}
          requestQueue[tail] = request;
          tail = (tail + 1) % requestQueue.length;
          count++;
          notifyAll();
        }
      }
    
      public synchronized Request takeRequest() {
        while (count <= 0) {
          try {
            wait();
          } catch (InterruptedException e) {}
          Request request = requestQueue[head];
          head = (head + 1) % requestQueue.length;
          count--;
          notifyAll();
          return request;
        }
      }
    }
    

    Worker Thread 클래스
    public class WorkerThread extends Thread {
      private final Channel channel;
      public WorkerThread(String name, Channel channel){
        super(name);
        this.channel = channel;
      }
      public void run() {
        while (true) {
          Request request = channel.takeRequest();
          request.execute();
        }
      }
    }
    

    Worker Thread 모드의 등장 역할
  • 클라이언트 역할은 작업 요청을 나타내는 Request 역할을 만들어 Channel 역할에 전달합니다.샘플 프로그램에서 ClientThread 클래스가 이 역할을 수행합니다.
  • Channel(통신선)Channel 역할은 클라이언트 역할의 Rquest 역할을 받아들여 워커 역할에 전달한다.샘플 프로그램에서 Channel 클래스가 이 역할을 수행합니다.
  • 워커 역할은 Channel 역할에서 Request 역할을 가져와 작업합니다.작업이 완료되면 계속해서 다른 Request 역할을 가져옵니다.예시 프로그램에서 WorkerThread 클래스가 이 역할을 합니다.
  • Request 역할은 작업을 나타내는 역할입니다.작업을 수행하는 데 필요한 정보가 Request 역할에 저장됩니다.예시 프로그램에서 Request 클래스가 이 역할을 합니다.
  • 좋은 웹페이지 즐겨찾기