class
sharadata
num++
; system.out.
println
(thread.
currentthread()
.getname()
+"生產");
condition.
signalall()
;}catch
(interruptedexception e)
finally
}public
void
decrement()
num--
; system.out.
println
(thread.
currentthread()
.getname()
+"消費");
condition.
signalall()
;}catch
(interruptedexception e)
finally}}
public
class
main})
.start()
;new
thread((
)->})
.start()
;}}
class
sharedata
//生產者
public
void
product()
throws interruptedexception
else
thread.
sleep
(500);
}}//消費者
public
void
consume()
throws interruptedexception
else
thread.
sleep
(700);
}}//停止生產和消費
public
void
stop()
}
public
static
void
main
(string[
] args)
catch
(interruptedexception e)})
.start()
;new
thread((
)->
catch
(interruptedexception e)})
.start()
;try
catch
(interruptedexception e)
sharedata.
stop()
; system.out.
println
("停止生產和消費");
}
執行緒a列印123456…執行緒b列印abcdefg…交叉列印結果1a2b3c…
利用synchronized同步鎖加wait/notify實現
兩個細節:1、如何保證一定是第乙個執行緒先執行?使用countdownlatch
2、一定是先notify再wait,在for迴圈之後必須notify,否則程式不會結束,一定有乙個執行緒在等待喚醒
public
static
void
main
(string[
] args)
catch
(interruptedexception e)
} o.
notify()
;//列印結束後一定要喚醒另乙個執行緒}}
,"t1").
start()
;new
thread((
)->
catch
(interruptedexception e)
synchronized
(o)catch
(interruptedexception e)
} o.
notify()
;//列印結束後一定要喚醒另乙個執行緒}}
).start()
;}
利用locksupport實現
public
class
main})
; t2 =
newthread((
)->})
; t1.
start()
; t2.
start()
;}}
利用reentrantlock和condition實現。實現思路與synchronized一樣,只不過使用condition精確喚醒
public
static
void
main
(string[
] args)
condition2.
signal()
;//執行緒執行完畢後記得喚醒另乙個執行緒
}catch
(interruptedexception e)
finally})
.start()
;new
thread((
)->
condition1.
signal()
;}catch
(interruptedexception e)
finally})
.start()
;}
生產者消費者 生產者與消費者模式
一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...
生產者消費者
using system using system.collections.generic using system.threading namespace gmservice foreach thread thread in producers q.exit console.read public...
生產者消費者
執行緒通訊 乙個執行緒完成了自己的任務時,要通知另外乙個執行緒去完成另外乙個任務.wait 等待 如果執行緒執行了wait方法,那麼該執行緒會進入等待的狀態,等待狀態下的執行緒必須要被其他執行緒呼叫notify方法才能喚醒。notify 喚醒 喚醒執行緒池等待執行緒其中的乙個。notifyall 喚...