java多線程之生產者消費者隊列

java多線程一般都會講消費者-生產者模型

生產者與消費者模型中,要保證以下幾點:
1 同一時間內只能有一個生產者生產
2 同一時間內只能有一個消費者消費
3 生產者生產的同時消費者不能消費
4 消息隊列滿時生產者不能繼續生產
5 消息隊列空時消費者不能繼續消費

----------------------------------------------------Message類

public class Message {

 
public static int id;
public String content;


public String getContent() {
 return content;
}


public void setContent(String content) {
 this.content = content;
}


public int getId() {
 return id;
}


public void setId(int id) {
 Message.id = id;
}

}

-------------------------------------------------------------------------------------------------------------Queue類

import java.util.ArrayList;
import java.util.List;


public class Queue {
 List<Message> queue = new ArrayList<Message>();


 /** 隊列中message對象的最大值,默認爲5 */
 int maxMessageNum = 5;


 public synchronized void produce(Message message) {


  this.notifyAll();
  while (queue.size() == maxMessageNum) {
   System.out.println(Thread.currentThread().getName()
     + "  隊列滿!等待中。。。");
   try {
    this.wait();
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
  queue.add(message);
  System.out.println(Thread.currentThread().getName() + "正在生產"
    + message.getContent() + "。。。  ,當前個數:" + getCount());


 }


 public synchronized void consume() {


  this.notifyAll();
  while (queue.size() == 0) {
   System.out.println(Thread.currentThread().getName()
     + "  隊列空!等待中。。。");
   try {
    System.out.println("begin!");
    wait();
    System.out.println("end!");
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }


  Message message = queue.get(0);
  queue.remove(0);
  System.out.println(Thread.currentThread().getName() + "正在消費"
    + message.getContent() + "。。。 ,當前個數: " + getCount());


 }


 public synchronized int getCount() {
  return queue.size();
 }
}



-----------------------------------------------------------------------------------------------------------------------------------------------Test類


public class Test {


public static void main(String[] args) {


 Queue Q = new Queue();


 Producer wQ1 = new Producer(Q);
 Producer wQ2 = new Producer(Q);
 
 Consumer rQ1 = new Consumer(Q);
 Consumer rQ2 = new Consumer(Q);
 Consumer rQ3 = new Consumer(Q);
 
 Thread threadWQ1 = new Thread(wQ1, "thread-wQ1");
 Thread threadWQ2 = new Thread(wQ2, "thread-wQ2");


 Thread threadRQ1 = new Thread(rQ1, "thread-rQ1");
 Thread threadRQ2 = new Thread(rQ2, "thread-rQ2");
 Thread threadRQ3 = new Thread(rQ3, "thread-rQ3");
 
 threadWQ1.start();
 threadWQ2.start();
 
 threadRQ1.start();
  threadRQ2.start();
  threadRQ3.start();
}
}


class Producer extends Thread {


private Queue queue;


Producer(Queue queue) {
 this.queue = queue;
}


public void run() {
 
 while (true) {
  Message message = new Message();
  message.setId(++Message.id);
  message.setContent("food"+Message.id);
  queue.produce(message);
  try {
   sleep(100);
  } catch (Exception e) {
  }
 }


}
}


class Consumer extends Thread {
private Queue queue;


Consumer(Queue queue) {
 this.queue = queue;
}


public void run() {
 while (true) {
  queue.consume();
  try {
   sleep(100);
  } catch (Exception e) {
  }


 }
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章