美文网首页
线程生产者与消费者问题 2018-05-14

线程生产者与消费者问题 2018-05-14

作者: 码记 | 来源:发表于2018-05-14 20:58 被阅读0次

 生产者与消费者:也称为有限缓冲的问题

(1) 生产者:主要作用是生成一定量的数据放到缓冲区中,然后重复此过程

(2) 消费者:生产者生成好一定量到缓冲区的同时,消费者也在缓冲区消耗这些数据。

(3) 步骤:

① 因为生产者和消费者都是共享一块区域,即仓库

② 仓库是有容量上限的,当数量达到上限后,生产者不允许继续生产产品,当前线程进入等待状态,等待其他线程唤醒

③ 当仓库没有产品时,消费者不允许继续消费,当前线程进入等待状态,等待其他线程唤醒

(4) 代码实现:

① 生产者跟消费者之间消费的是产品,定义一个产品类

Public class Product{

Int id;//定义产品的唯一ID

//定义构造方法初始化产品id

Public Product(int id){

This.id=id;

}

}

② 定义一个仓库用来存放产品

Public class Repertory{

//定义一个集合类用于存放产品,规定仓库最大容量为10

Public LinkedList store=new LinkedList();

Public LinkedList getStore(){

Return store;

}

Public void setStore(LinkedList store){

This.store=store;

}

/*生产者

*push()用于存放产品

*参数:第一个是产品对象

*第二是线程名称,用来显示是谁生产的

*使用synchronized关键字修饰方法

*最多只能一个有一个线程同时访问方法

*/

Public synchronized void push(Product p,String threadName){

/*仓库容量最大值为10,当容量=10时进入等待状态,等待其他线程*唤醒,唤醒后继续循环,等到仓库的存量小于10,跳出循环继续向*下执行准备生产产品

*/

While(store.size()==10){

Try{

//打印日志

System.out.println(threadName+”报告:仓库已满->进入等待状态->呼叫消费者消费”);

//仓库容量已满,进入等待状态,等待被唤醒

This.wait();

} catch(Exception e){

}

}

This.notifyAll();//唤醒所有等待线程

Store.addLast(p);//将产品添加到仓库中

System.out.println(threadName+”生产’+p.id+”号产品”+” ”+”当前库存:”+store.size());

Try{

Thread.sleep(1000);

}catch(Exception e){

}

}

/*消费者方法

*pop()方法用于存放产品

*/

Public synchronized void pop(String threadName){

//仓库没有存货,消费者进入等待被唤醒,唤醒后进行循环

While(store.size()==0){

Try{

System.out.println(threadName+”仓库已空,进入等待,生产者生成产品”);

This.wait();

} catch(Exception e){}

}

This.notifyAll();//唤醒所有等待线程

System.out.println(threadName+”消费了:”+store.removeFirst().id+”号产品”+” ”+”当前库存:”

Try{

Thread.sleep();

}catch(Exception e){

}

}

}

③ 定义生产者

Public class Producer implements Runnable{

//定义一个静态变量记录产品号数,唯一

Public static Integer count=0;

Repertory repertory=null;//定义仓库

Public Producer(Repertory repertory){

This.repertory=repertory;

}

@Override

Public void run(){

While(true){

Synchronized(Producer.class){

Count++;

Product product=new Product(count);

Repertory.push(product,thread.currentThread().getName());

}

}

}

}

④ 定义一个消费者

Public class Consumer implements Runnable{

Repertory repertory=null;//定义仓库

Public Consumer(Repertory repertory){

This.repertory=repertory;

}

@Override

Public void run(){

While(true){

Repertory.pop(Thread.currentThread().getName());

}

}

}

相关文章

网友评论

      本文标题:线程生产者与消费者问题 2018-05-14

      本文链接:https://www.haomeiwen.com/subject/iofsdftx.html