手卑ででたらめを書いて見ないでください:生産者の消費者-同期の問題

14707 ワード

  1 package ThreadL;

  2 

  3 import java.util.LinkedList;

  4 

  5 class Queue extends LinkedList<String>{

  6     int lenght;

  7     public Queue(){

  8         

  9     }

 10     

 11     public Queue(int length){

 12         this.lenght = length;

 13     }

 14     

 15     public int getLength(){

 16         return this.lenght;

 17     }

 18     

 19     public String shift(){

 20         if(!this.isEmpty()){

 21             return this.remove();

 22         }else{

 23             return " ";

 24         }

 25     }

 26     

 27     public void push(String ch){

 28         if(this.size()<=this.lenght){

 29             this.addLast(ch);

 30         }

 31     }

 32     

 33     public boolean isFull(){

 34         if(this.size() == this.lenght){

 35             return true;

 36         }else{

 37             return false;

 38         }

 39     }

 40 }

 41 class Depot{

 42     Queue queue = null;

 43     public Depot(int length){

 44         this.queue = new Queue(length);

 45     }

 46     static int i = 1;

 47     public synchronized void produce(String ch){

 48         this.notify();

 49         while(this.queue.isFull()){

 50             try {

 51                 this.wait();

 52             } catch (InterruptedException e) {

 53                 e.printStackTrace();

 54             }

 55         }

 56         this.queue.push(ch);

 57         System.out.println(" \t" + (i++) + "\t \t" + this.queue.getLast());

 58     }

 59     public synchronized void consume(){

 60         this.notify();

 61         while(this.queue.isEmpty()){

 62             try {

 63                 this.wait();

 64             } catch (InterruptedException e) {

 65                 e.printStackTrace();

 66             }

 67         }

 68         System.out.println(" \t" + (--i) + "\t \t" + this.queue.getFirst());

 69         this.queue.shift();

 70     }

 71 }

 72 class Produce implements Runnable{

 73     Depot depot;

 74     public Produce(Depot depot){

 75         this.depot=depot;

 76     }

 77     public void run(){

 78         for(int i=0;i<10;i++){

 79             this.depot.produce("A");

 80         }

 81     }

 82 }

 83 class Consume implements Runnable{

 84     Depot depot;

 85     public Consume(Depot depot){

 86         this.depot= depot;

 87     }

 88     public void run(){

 89         for(int i=0;i<10;i++){

 90             this.depot.consume();

 91         }

 92     }

 93 }

 94 public class Thread10 {

 95     public static void main(String[] args){

 96         Depot depot = new Depot(8);

 97         Thread pro = new Thread(new Produce(depot));

 98         Thread con = new Thread(new Consume(depot));

 99         pro.start();

100         pro.setName("PRO");

101         con.start();

102         con.setName("CON");

103     }

104 }