1.基於synchronzied底層,與wait、notifyall實現
object類提供的wait、notify方法,配合synchronized使用,操作更底層,可擴充套件性和可控制性小。
先來介紹一下wait()、notify()、notifyall()方法:
wait():object類的方法,只能在同步方法或在同步**塊中使用;該方法會在wait()所在的**處停止執行,直到被notify()喚醒;會交出cpu,會釋放鎖,執行緒從執行態 -> 阻塞態;
notify():使停止的執行緒繼續執行,只能在同步方法或在同步**塊中使用;退出同步**塊之後才會釋放物件鎖;如果有多個執行緒wait,挑出乙個執行緒喚醒。
notifyall():喚醒所有等待的執行緒。
原始碼:
class
goods
system.out.
println
(thread.
currentthread()
.getname()
);//生產商品,一次多個
this
.goodsname = goodsname;
this
.count = count +1;
thread.
sleep
(1000);
system.out.
println
("生產"
+tostring()
);notifyall()
;}//消費方法
public
synchronized
void
get(
)throws interruptedexception
system.out.
println
(thread.
currentthread()
.getname()
);this
.count = count -1;
thread.
sleep
(1000);
system.out.
println
("消費"
+tostring()
);notifyall()
;}@override
public string tostring()
}//生產者類
class
producer
implements
runnable
@override
public
void
run(
)catch
(interruptedexception e)}}
}//消費者類
class
consumer
implements
runnable
@override
public
void
run(
)catch
(interruptedexception e)}}
}public
class
main
for(
int i =
0; i<
5; i++
)for
(thread thread:threadlist)
}}
2.在condition機制下,與lock體系配合實現
condition機制下的生產消費者模型,與lock體系配合使用,操作在語言層,可擴充套件性和可控制性好
await()、signalall()方法
原始碼:
class
goods
private lock lock =
newreentrantlock()
;private condition producer = lock.
newcondition()
;private condition consumer = lock.
newcondition()
;//生產方法
public
void
setgoods
(string goodsname)
thread.
sleep
(1000);
system.out.
println
(thread.
currentthread()
.getname()
);this
.goodsname = goodsname;
count++
; system.out.
println
("生產"
+tostring()
);producer.
signalall()
;}catch
(interruptedexception e)
finally
}//消費方法
public
void
getgoods
(string goodsname)
system.out.
println
(thread.
currentthread()
.getname()
);this
.goodsname = goodsname;
count--
; system.out.
println
("消費"
+tostring()
);consumer.
signalall()
;}catch
(interruptedexception e)
finally
}@override
public string tostring()
}//生產者類
class
producer
implements
runnable
@override
public
void
run()}
}//消費者類
class
consumer
implements
runnable
@override
public
void
run()}
}public
class
main
for(
int i =
0; i<
5; i++
)for
(thread thread:threadlist)
}}
Java 生產者 消費者模型
生產者消費者問題是執行緒模型中的經典問題 生產者和消費者在同一時間段內共用同一儲存空間,生產者向空間裡生成資料,而消費者取走資料。此處實現如下情況的生產 消費模型 生產者不斷交替地生產兩組資料 姓名 1 內容 1 姓名 2 內容 2 消費者不斷交替地獲取這兩組資料,這裡的 姓名 1 和 姓名 2 模...
生產者消費者模型
1.生產者消費者問題 producer consumer 有限緩衝,多執行緒同步。生產者執行緒和消費者執行緒共享固定大小緩衝區。2.關鍵是保證生產者不會再緩衝區滿時加入資料,消費者不會在緩衝區空時消耗資料。3.解決辦法 讓生產者在緩衝區滿時休眠,等下次消費者消耗緩衝區中的資料的時候,生產者才能被喚醒...
生產者消費者模型
生產者與消費者 3,2,1 三種關係 生產者與消費者 互斥,同步 消費者與消費者 互斥 生產者與生產者 互斥 條件變數 int pthread cond destroy pthread cond t cond int pthread cond init pthread cond t restrict...