多线程:生产者消费者问题
1.假設(shè)倉庫只能存一件產(chǎn)品,生產(chǎn)者將產(chǎn)品放入倉庫,消費(fèi)者將產(chǎn)品從倉庫取出
2.倉庫沒有產(chǎn)品,生產(chǎn)者將產(chǎn)品放倉庫,否則停止生產(chǎn)并等待,直到倉庫產(chǎn)品被消費(fèi)者取走
3.如果倉庫放有產(chǎn)品,消費(fèi)者可取走,否則停止消費(fèi)并等待,直到倉庫再次放入產(chǎn)品
===============
線程通信-分析
生產(chǎn)者沒有生產(chǎn)產(chǎn)品之前,要通知消費(fèi)者等待,生產(chǎn)產(chǎn)品之后,通知消費(fèi)者消費(fèi)
消費(fèi)者消費(fèi)后通知生產(chǎn)者已經(jīng)結(jié)束消費(fèi),需要生產(chǎn)新產(chǎn)品供消費(fèi)
生產(chǎn)者和消費(fèi)者問題中,僅有synchronized是不夠的
synchronized可組止并發(fā)更新同一個(gè)共享資源,實(shí)現(xiàn)同步
synchronized不能實(shí)現(xiàn)線程之間消息傳遞(通信)
=================
線程通信方法
wait():線程一直等待,直到其他線程通知,與sleep不同,會(huì)釋放鎖
wait(long timeout):指定等待的毫秒數(shù)
notify():喚醒處于等待狀態(tài)的線程
notifyAll():喚醒所有調(diào)用wait()方法的線程,優(yōu)先級(jí)別高的線程優(yōu)先調(diào)度
都是Object類方法,都只能在同步方法或同步代碼塊中使用,否則拋出IIIegaIMonitorStateException
============
解決方式一:
管程法
生產(chǎn)者:負(fù)責(zé)生產(chǎn)數(shù)據(jù)的模塊(可能是方法,對象,線程,進(jìn)程);
消費(fèi)者:負(fù)責(zé)處理數(shù)據(jù)的模塊(可能是方法,對象,線程,進(jìn)程);
緩沖區(qū):消費(fèi)者不能直接使用生產(chǎn)者的數(shù)據(jù),他們之間有緩沖區(qū),生產(chǎn)者將數(shù)據(jù)放入緩沖區(qū),消費(fèi)者從緩沖區(qū)拿數(shù)據(jù)
解決方式二:
并發(fā)協(xié)作模型,信號(hào)燈法
總結(jié)
以上是生活随笔為你收集整理的多线程:生产者消费者问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BugkuCTF-Crypto题告诉你个
- 下一篇: C语言 Hello World - C语