10.生产者消费者模型

来源:互联网 发布:js new 数组 编辑:程序博客网 时间:2024/06/06 12:40
import java.util.ArrayList;import java.util.concurrent.Semaphore;import java.util.concurrent.SynchronousQueue;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;class Container{private ArrayList<Integer> list;//其他同步方式//private ReentrantLock lock;//private Condition condition;//private Semaphore sem;//private SynchronousQueue<Integer> queue;(专门产生的生产者消费者队列)public Container(ArrayList<Integer> list){this.list = list;}public synchronized void put(int value){while (list.size() > 0){try {//while循环防止虚假唤醒wait(); //进入this对象监视器锁的等待集合//唤醒以后,还要继续等待能够持有该监视器锁(从wait状态=>block阻塞状态)} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}list.add(value);System.out.println("product:" + value);notify();//notify()  唤醒this对象监视器锁等待集合中的某一个线程 => 使该线程进入block状态,其他线程还在等待状态//notifyAll()  唤醒this对象监视器锁等待集合中的所有线程  => 使所有线程进入block状态}public synchronized int get(){while (list.size() <= 0){try {wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}int value = list.get(list.size()-1);list.remove(list.size()-1);System.out.println("consume:" + value);notify();return value;}}class Producer extends Thread{private Container container;public Producer(Container container){this.container = container;}public void run(){for (int i = 0; i < 10; ++i){container.put(i+1);}}}class Consumer extends Thread{private Container container;public Consumer(Container container){this.container = container;}public void run(){for (int i = 0; i < 10; ++i){container.get();}}}public class TestDemo {public static void main(String[] args) {// TODO Auto-generated method stubContainer container = new Container(new ArrayList<Integer>());Consumer c = new Consumer(container);Producer p = new Producer(container);p.start();c.start();}}
利用SynchronousQueue简单模拟生产者消费者模型
import java.util.concurrent.SynchronousQueue;class Rongqi{private SynchronousQueue<Integer> queue;public Rongqi(){this.queue = new SynchronousQueue<Integer>();}public void put(int value){try {queue.put(value);System.out.println("product:" + value);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public int get(){int value = 0;try {value = queue.take();System.out.println("consume:" + value);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}return value;}}class Shengchan extends Thread{Rongqi container;public Shengchan(Rongqi container){this.container = container;}public void run(){for (int i = 0; i < 10; ++i){container.put(i+1);}}}class Xiaofei extends Thread{Rongqi container;public Xiaofei(Rongqi container){this.container = container;}public void run(){for (int i = 0; i < 10; ++i){container.get();}}}public class SynchronousQueueTest {public static void main(String[] args) {// TODO Auto-generated method stubRongqi container = new Rongqi();Shengchan p = new Shengchan(container);Xiaofei c = new Xiaofei(container);p.start();c.start();}}



0 0
原创粉丝点击