JAVA生產(chǎn)者消費(fèi)者(線程同步)代碼學(xué)習(xí)示例
一、問題描述
生產(chǎn)者消費(fèi)者問題是一個(gè)典型的線程同步問題。生產(chǎn)者生產(chǎn)商品放到容器中,容器有一定的容量(只能順序放,先放后拿),消費(fèi)者消費(fèi)商品,當(dāng)容器滿了后,生產(chǎn)者等待,當(dāng)容器為空時(shí),消費(fèi)者等待。當(dāng)生產(chǎn)者將商品放入容器后,通知消費(fèi)者;當(dāng)消費(fèi)者拿走商品后,通知生產(chǎn)者。
二、解決方案
對容器資源加鎖,當(dāng)取得鎖后,才能對互斥資源進(jìn)行操作。
public class ProducerConsumerTest {
public static void main(String []args){
Container con = new Container();
Producer p = new Producer(con);
Consumer c = new Consumer(con);
new Thread(p).start();
new Thread(c).start();
}
}
class Goods{
int id;
public Goods(int id){
this.id=id;
}
public String toString(){
return "商品"+this.id;
}
}
class Container{//容器采用棧,先進(jìn)后出
private int index = 0;
Goods[] goods = new Goods[6];
public synchronized void push(Goods good){
while(index==goods.length){//當(dāng)容器滿了,生產(chǎn)者等待
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
goods[index]=good;
index++;
notifyAll();//當(dāng)生產(chǎn)者放入商品后通知消費(fèi)者
}
public synchronized Goods pop(){
while(index==0){//當(dāng)容器內(nèi)沒有商品是等待
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
index--;
notifyAll();//當(dāng)消費(fèi)者消費(fèi)了商品后通知生產(chǎn)者
return goods[index];
}
}
class Producer implements Runnable{
Container con = new Container();
public Producer(Container con){
this.con=con;
}
public void run(){
for(int i=0; i<20; i++){
Goods good = new Goods(i);
con.push(good);
System.out.println("生產(chǎn)了:"+good);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable{
Container con = new Container();
public Consumer(Container con){
this.con=con;
}
public void run(){
for(int i=0; i<20; i++){
Goods good=con.pop();
System.out.println("消費(fèi)了:"+good);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
相關(guān)文章
解決nacos啟動(dòng)報(bào)錯(cuò)Server check fail, please che
這篇文章主要介紹了nacos啟動(dòng) Server check fail, please check server localhost ,port 9848 is available的錯(cuò)誤原因以及解決方法,需要的朋友可以參考下2023-09-09SpringBoot實(shí)現(xiàn)單文件與多文件上傳功能
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)單文件與多文件上傳功能,Spring?MVC對文件上傳做了簡化,而在Spring?Boot中對此做了更進(jìn)一步的簡化,文件上傳變得更為方便,下面開始演示,需要的小伙伴可以參考一下,希望對你有所幫助2022-01-01mybatis-plus實(shí)現(xiàn)打印完整sql語句
這篇文章主要介紹了mybatis-plus實(shí)現(xiàn)打印完整sql語句方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07logback-spring.xml的配置及示例詳解(直接復(fù)制粘貼可用)
在使用logback作為日志框架時(shí),可以創(chuàng)建一個(gè)名為logback-spring.xml的配置文件來自定義日志輸出的格式和方式,下面這篇文章主要給大家介紹了關(guān)于logback-spring.xml的配置及示例詳解的相關(guān)資料,文中的代碼直接復(fù)制粘貼可用,需要的朋友可以參考下2024-01-01詳解Elasticsearch如何實(shí)現(xiàn)簡單的腳本排序
Elasticsearch?是位于?Elastic?Stack?核心的分布式搜索和分析引擎,可以為所有類型的數(shù)據(jù)提供近乎實(shí)時(shí)的搜索和分析。本文主要介紹了Elasticsearch如何實(shí)現(xiàn)簡單的腳本排序,感興趣的可以了解一下2023-01-01java實(shí)現(xiàn)調(diào)用http請求的五種常見方式
在實(shí)際開發(fā)過程中,我們經(jīng)常需要調(diào)用對方提供的接口或測試自己寫的接口是否合適,本文主要介紹了java實(shí)現(xiàn)調(diào)用http請求的四種常見方式,感興趣的可以了解一下2024-07-07