JAVA多線程實現(xiàn)生產者消費者的實例詳解
更新時間:2017年06月09日 09:18:05 作者:m1457285665
這篇文章主要介紹了JAVA多線程實現(xiàn)生產者消費者的實例詳解的相關資料,需要的朋友可以參考下
JAVA多線程實現(xiàn)生產者消費者的實例詳解
下面的代碼實現(xiàn)了生產者消費者的問題
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 List<Product>products=new LinkedList<Product>(); 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(); } } } }
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 Thread(new Consumer("consumer "+i,pool)); Thread producer=new Thread(new Producer("producer "+i,pool)); consumer.start(); producer.start(); } } }
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
WeakHashMap?和?HashMap?區(qū)別及使用場景
這篇文章主要為大家介紹了WeakHashMap?和?HashMap?的區(qū)別是什么以及何時使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11詳解Springboot應用中設置Cookie的SameSite屬性
Chrome 51 開始,瀏覽器的 Cookie 新增加了一個SameSite屬性,用來防止 CSRF 攻擊和用戶追蹤。今天通過本文給大家介紹Springboot應用中設置Cookie的SameSite屬性,感興趣的朋友一起看看吧2022-01-01springboot業(yè)務功能實戰(zhàn)之告別輪詢websocket的集成使用
WebSocket使得客戶端和服務器之間的數(shù)據交換變得更加簡單,允許服務端主動向客戶端推送數(shù)據,下面這篇文章主要給大家介紹了關于springboot業(yè)務功能實戰(zhàn)之告別輪詢websocket的集成使用,需要的朋友可以參考下2022-10-10淺析SpringBoot微服務中異步調用數(shù)據提交數(shù)據庫的問題
這篇文章主要介紹了SpringBoot微服務中異步調用數(shù)據提交數(shù)據庫的問題,今天本文涉及到的知識點不難,都是很簡單的crud操作,本文結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2022-07-07解決idea中maven新增的配置文件xx.xml沒生效問題
這篇文章主要介紹了如何解決idea中maven新增的配置文件xx.xml沒生效問題,公司項目有用自己的`私服,Maven正常去私服下載jar包是沒問題的,但阿里云鏡像找不到相關的jar包報錯,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2024-06-06