JAVA多线程实现生产者消费者的实例详解

网友投稿 282 2023-05-08


JAVA多线程实现生产者消费者的实例详解

java多线程实现生产者消费者的实例详解

下面的代码实现了生产者消费者的问题

Product.Java

package consumerProducer;

public class Product {

private String id;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public Product(String id)

{

this.id=id;

}

public String toString()

{

return "product "+id;

}

}

Pool.java

package consumerProducer;

import java.util.*;

public class Pool {

private int number=0;

private Listproducts=new LinkedList();

public int getNumber() {

return number;

}

public void setNumber(int number) {

this.number = number;

}

public synchronized Product consumeProduct(){ //可以去掉synchronized关键字

if(products.size()>0)

{ Product p= products.get(0);

products.remove(0);

number--;

return p;

}

else

return null;

}

public synchronized void addProduct(Product p){ //可以去掉synchronized关键字

products.add(p);

number++;

}

}

Consumer.java

package consumerProducer;

public class Consumer implements Runnable {

private String id;

Pool pool;

public Consumer(String id,Pool pool)

{

this.id=id;

this.pool=pool;

}

@Override

public void run() {

while(!Thread.currentThread().interrupted())

{

Product product=null;

synchronized(pool){

while(pool.getNumber()<=0)//生产不足

{

try {

pool.wait();//生产者等待

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

product=pool.consumeProduct();

}

System.out.println("consuming "+id+product.toString());

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

Producer.java

package consumerProducer;

public class Producer implements Runnable{

private int i_p=0;

private String id;

Pool pool;

int i=0;

public Producer(String id ,Pool pool)

{

this.id=id;

this.pool=pool;

}

public Product createProduct()

{

return new Product(String.valueOf(++i_p));

}

@Override

public void run() {

// TODO Auto-generated method stub

while(!Thread.currentThread().interrupted())

{

Product p=new Product(String.valueOf(++i_p));

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

synchronized(pool)

{

pool.addProduct(p);

System.out.println("producer "+id+" adding product...."+p.toString());

pool.notifyAll();

}

}

}

}http://

Main.java

package consumerProducer;

public class Main {

public static void main(String[] args) {

// TODO Auto-generated method stub

Pool pool=new Pool();

for(int i=0;i<5;i++)

{

Thread consumer=new ThpeMrBMdlHRread(new Consumer("consumer "+i,pool));

Thread producer=new Thread(new Producer("producer "+i,pool));

peMrBMdlHRconsumer.start();

producer.start();

}

}

}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微信小程序开发之toast提示插件使用示例
下一篇:浅谈 Vue v
相关文章

 发表评论

暂时没有评论,来抢沙发吧~