多執行緒系列之生產者和消費者

2021-08-02 14:52:59 字數 1407 閱讀 9462

在之前接觸過pv操作的,應該對於生產者和消費者的情況有乙個了解,這裡學到多執行緒同步的時候,最恰當的乙個例子。pv操作就不多做解釋。

/**

* 生產者和消費者

* @author bobo

* */

public class producerconsumer

}//產品-窩頭

class wotou

public string tostring()

}//同步棧,產品盛放的容器

class syncstack catch (interruptedexception e)

} this.notifyall();//通知消費者,可使用產品

arrwt[index]=wt;

index++;//放入產品 }

//向容器中拿產品時,其他執行緒不能使用,已經被鎖定

public synchronized wotou pop() catch (interruptedexception e)

} this.notifyall();//通知生產者,可以進行生產

index--;

return arrwt[index];//棧中有空位 }}

//生產者,向容器中放產品

class producer implements runnable

public void run() catch (interruptedexception e)

} }}//消費者,從容器中取產品

class consumer implements runnable

public void run() catch (interruptedexception e)

} }}

有乙個容器可以裝產品,兩邊是生產者和消費者,可以是乙個也可以是多個。他們為了保證生產者放乙個,消費者拿乙個,同時也不會出現,生產者還沒有放,消費者就可以去拿了,那會使容器中的產品出現負數,這樣顯然是不對的。

使用synchronized鎖定**塊,讓生產者向容器放東西的時候,消費者還不能拿到這個產品。

補充:notify

()/notifyall()

通知,在生產者和消費者這個問題上,當生產者產生產品以後,可以通過訊號量,通知消費者,它已經獲得了資源。可以進行消費了。

防止大家都在等待,而造成執行緒阻塞。

wait

()和sleep

()區別

wait

()是object

類中的方法,之後其他人可以使用

sleep

()是thread

類的方法,之後其他人也不可以使用

多執行緒 生產者和消費者

生產者 消費者問題 生產者向產品區里放產品,當產品區里滿了,需要等待 消費者從產品區里取產品消耗,當產品區里空了,需要等待。public class producerandconsumer 消費者 static class consumer implements runnable catch int...

多執行緒 生產者和消費者

前面說過,每個執行緒都有自己的資源,但是 區是共享的,即每個執行緒都可以執行相同的函式。這可能帶來的問題就是幾個執行緒同時執行乙個函式,導致資料的混亂,產生不可預料的結果,因此我們必須避免這種情況的發生。c 提供了乙個關鍵字lock,它可以把一段 定義為互斥段 critical section 互斥...

多執行緒 生產者消費者

這個就不多說了,直接上 include include using namespace std const unsigned short size of buffer 10 緩衝區長度 unsigned short productid 0 產品號 unsigned short consumeid 0...