달력

10

« 2020/10 »

  •  
  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2007. 10. 24. 14:41

생성자-소비자 (FIFO 큐) Thread JAVA/Thread2007. 10. 24. 14:41

사용자 삽입 이미지


import java.util.NoSuchElementException;
/**
 *  생성자와 소비자가 공통으로 사용할 메소드 정의
 *  생성자 put() 메소드 이용 데이터를 큐에 넣음
 *  소비자는 pop() 메소드를 이용해 데이터를 꺼내 씀
 */

public interface Queue {
     public String getName();
     public void clear();
     public void put(Object o);
     public Object pop() throws InterruptedException, NoSuchElementException;
     public int size();
}

===========================================================
/*
* Queue을 할당 받아서 재 정의한 클래스
* 실제 업무는 아래 클래스가 처리함
*/

import java.util.LinkedList;
import java.util.NoSuchElementException;

public class JobQueue implements Queue{
     private static final String NAME = "JOB QUEUE";
     private static final Object monitor = new Object();
 
     private LinkedList jobs = new LinkedList();
 
     // 하나의 객체만을 생성해서 사용할 수 있도록 싱글톤 패턴을 사용
     private static JobQueue instance = new JobQueue();
     private JobQueue(){}
 
     public static JobQueue getInstance(){
          if(instance == null){
               synchronized (JobQueue.class) {
                    instance = new JobQueue();
               }
          }
          return instance;
     }
     public String getName() {
          return NAME;
     }
 
     public LinkedList getLinkedList(){
          return jobs;
     }
 
     public void clear() {
          synchronized (this.monitor) {
               jobs.clear();
          }
     }
     // 생성자가 작업을 입력함
     // put 과 pop 에서는 반드시 synchronized로 동기화를 얻어야 함
     public void put(Object o) {
          synchronized (monitor) {
               jobs.addLast(o);
               // new 데이터 추가로 queue를 이용할 수 있으므로
               // 만약 대기중인 thread 있으면 깨움, 깨워야 작업이 가능
               monitor.notify();
          }
     }

     // 소비자가 작업을 받아옴
     public Object pop() throws InterruptedException, NoSuchElementException {
          Object o = null;
          synchronized (monitor) {
               // 더 이상 queue에서 이용할 수 있는 데이터가 없으므로 thread 대기
               // 사용하지 않으므로 대기 상태로 둠
               if(jobs.isEmpty()){
                    monitor.wait();
               }
               o = jobs.removeFirst();
          }
          if(o ==null)  throw new NoSuchElementException();
       return o;
     }

     public int size() {
          return jobs.size();
     }
}

==================================================================
/**
 *  생성자 클래스
 * Queue에 0부터 하나씩 숫자를 증가 시킴 -->
 * 일은 차후 재정의 해야 함
 */
public class Producer implements Runnable{
     private Queue queue = null;
     public Producer(Queue queue){
          this.queue = queue;
     }
     public void run(){
          System.out.println("[Start Producer .. ]");
          try{
               int i = 0;
               while(!Thread.currentThread().isInterrupted()){
                    queue.put(Integer.toString(i++));
               }
          }catch(Exception e){
               e.printStackTrace();
          }finally{
               System.out.println("[End Producer]");
          }
     }
}

=========================================================
/**
 * 소비자 클래스
 * Queue에서 데이터를 하나씩 꺼내서 자신의 이름과 함께 콘솔에 출력함
 */
public class Consumer implements Runnable{
     private Queue queue = null;
     private String name = null;
 
     public Consumer(Queue queue, String index){
          this.queue = queue;
          name = "Consumer - " + index;
     }
     public void run(){
          System.out.println("[Start ==> " + name + ":..]");
          try{
               while(!Thread.currentThread().isInterrupted()){
                    System.out.println(name + " : " + queue.pop().toString());
               }
          }catch(Exception ee){
               ee.printStackTrace();
          }finally{
               System.out.println("[End ==> " + name + "..]" );
          }
     }
}
=========================================================
// 실행 메소드
public class QueueThreadRun {
     public static void main(String[] args) throws InterruptedException{
          //Queue 생성
          Queue queue = JobQueue.getInstance();
 
          // Consumer 생성하고 시작함
          Thread con1 = new Thread(new Consumer(queue,"1"));
          Thread con2 = new Thread(new Consumer(queue,"2"));
          Thread con3 = new Thread(new Consumer(queue,"3"));
 
          con1.start();
          con2.start();
          con3.start();
 
          // Producer를 생성하고 시작함
          Thread pro = new Thread(new Producer(queue));
          pro.start();
 
          // 5초간 멈춤
          Thread.sleep(500);
 
          // Producer를 종료 시킴
          pro.interrupt();
 
          //5초간 멈춤
          Thread.sleep(500);
 
          //Consumer 종료
          con1.interrupt();
          con2.interrupt();
          con3.interrupt();
     }
}

Posted by 비회원

댓글을 달아 주세요

  1. Favicon of http://www.timberlandbaratas.com BlogIcon barato timberland 2012.12.24 12:49  댓글주소  수정/삭제  댓글쓰기

    Un adolescent de 17 ans a été mis en examen et écroué dans le cadre d'une affaire de viol sur une jeune fille de 12 ans a-t-on appris jeudi de source judiciaire, http://www.timberlandbaratas.com timberland niños.té nus et Thierry de Cordier c, http://www.timberlandbaratas.com Hombre Timberland?té nuées, http://www.timberlandbaratas.com Timberland shops. une ex-république soviétique très pauvre, http://www.timberlandbaratas.com outlet timberland.
    Related articles:


    http://www.sxtv3.com/plus/view.php?aid=168404 http://www.sxtv3.com/plus/view.php?aid=168404

    http://ddt.wg920.net/viewthread.php?tid=1129386&extra= http://ddt.wg920.net/viewthread.php?tid=1129386&extra=

    http://htxx.pynet.net/index.asp http://htxx.pynet.net/index.asp