基于内置锁的生产者消费者模型
2017-05-06 16:43
183 查看
这里有三个概念,生产者,消费者,仓库
public class Repository {
private int capability;//仓库容量
private boolean stoped=false;//生产者线程是否退出的标志,如果生产者线程退出,则消费者线程消费完所以商品后也退出,而不是等待
private List<String> list=new ArrayList<>();
public Repository(int capability){
this.capability=capability;
}
public synchronized void add(String product) throws InterruptedException {
list.add(product);
}
public synchronized String remove() throws InterruptedException {
return list.remove(0);
}
public boolean isFull(){
return list.size()==capability;
}
public boolean isEmpty(){
return list.size()==0;
}
public void stop(){
stoped=true;
}
public boolean isStoped(){
return stoped;
}
}
public class Repository {
private int capability;//仓库容量
private boolean stoped=false;//生产者线程是否退出的标志,如果生产者线程退出,则消费者线程消费完所以商品后也退出,而不是等待
private List<String> list=new ArrayList<>();
public Repository(int capability){
this.capability=capability;
}
public synchronized void add(String product) throws InterruptedException {
list.add(product);
}
public synchronized String remove() throws InterruptedException {
return list.remove(0);
}
public boolean isFull(){
return list.size()==capability;
}
public boolean isEmpty(){
return list.size()==0;
}
public void stop(){
stoped=true;
}
public boolean isStoped(){
return stoped;
}
}
public class Productor extends Thread { private Repository repository; private int i=1; public Productor(Repository repository){ this.repository=repository; } @Override public void run(){ while (i<1000){ synchronized (repository){ try { if(!repository.isFull()){ Thread.sleep(100); String product=Thread.currentThread().getName()+(i++); System.out.println("生产商品:"+product); repository.add(product); repository.notifyAll(); }else { System.out.println("仓库已满,暂停生产"); // repository.notifyAll();如果notifyAll放在此次,则只有仓库满的时候会通知消费者 repository.wait(); } }catch (InterruptedException e) { e.printStackTrace(); } } } repository.stop(); } }
public class Consumer extends Thread { private Repository repository; public Consumer(Repository repository){ this.repository=repository; } @Override public void run(){ boolean stoped=false; while (!stoped){ synchronized (repository){ try { if(!repository.isEmpty()){ System.out.println("消费商品:"+repository.remove()); repository.notifyAll(); }else { System.out.println("仓库已空,暂停消费"); if(repository.isStoped()){ stoped=true; }else{ // repository.notifyAll();如果notifyAll放在此次,则只有仓库空的时候会通知生产者者 repository.wait(); } } }catch (InterruptedException e) { e.printStackTrace(); } } } } }
public class Main { public static void main(String[] args) throws InterruptedException { Repository repository=new Repository(100); new Productor(repository).start(); Thread.sleep(10000); new Consumer(repository).start(); } }
相关文章推荐
- 经典的生产者与消费者模型(基于synchronized方法实现)
- 基于Java多线程机制的生产者-消费者模型模拟
- 经典的生产者与消费者模型(基于BlockingQueue队列实现)
- 生产者与消费者模型(基于单链表、环形队列、多线程、多消费多生产)
- Linux生产者消费者模型--基于线程条件变量
- 分布式Web应用----基于Socket+动态代理实现简单RPC 生产者消费者模型
- 基于线程实现的生产者消费者模型(Object.wait(),Object.notify()方法)
- Linux基于单链表&环形队列的多线程生产者消费者模型
- 11.python并发入门(part8 基于线程队列实现生产者消费者模型)
- 基于线程实现的生产者消费者模型(Object.wait(),Object.notify()方法)
- linux网络编程之System V 信号量(三):基于生产者-消费者模型实现先进先出的共享内存段
- 基于单链表和基于环形队列的生产者消费者模型
- linux网络编程之System V 信号量(三):基于生产者-消费者模型实现先进先出的共享内存段
- 基于JAVA实现的生产者消费者模型
- 经典的消费者生产者模型——基于BlockingQueue
- 基于环形队列的生产者消费者模型编写。
- 基于c++11的短小精悍生产者消费者模型
- 基于单链表和环形队列的生产者-消费者模型
- 基于环形队列的单生产者单消费者模型
- 基于POSIX的信号量的生产者消费者模型