鎖物件的wait方法用來休眠乙個執行緒並釋放當前獲取到的鎖,同時將該執行緒加入該鎖物件的等待列表。從方法名也可以看出,該方法執行的效果是「等待」,也就是等待某個條件滿足後再喚醒當前執行緒繼續執行。
鎖物件的notify方法用來喚醒乙個該物件等待列表中的執行緒。notifyall用來喚醒等待列表中的所有執行緒。
生產者消費者模式是經典的執行緒同步模式,生產者生產一定量的產品放在緩衝區中,消費者從緩衝區中取走產品消費。該模式的關鍵在於生產者只有在緩衝區未滿時才能放入產品,否則需要等待;而消費者只有在緩衝區有資料時才能拿到產品並消費,否則也需要等待。
用**實現該模式,我們設計4個類,producer、consumer、table、food,producer負責生產food,生產出的food放在table上,consumer從table上拿走food。
food類:
public class food
public string getno()
public void setno(string no)
public string tostring()
}
producer類:
public class producer implements runnable
private void produce(table table)
catch (interruptedexception e)
}table.putfood(food);
table.notifyall();}}
@override
public void run()
}}
consumer類:
public class consumer implements runnable
private void consume(table table)
catch (interruptedexception e)
}food food = table.getfood();
table.notifyall();}}
public void run()
}}
table類:
public class table
public food getfood()
public void show()
}public int size()
}
producer的produce方法 用來生產乙個產品,由於table也會被consumer執行緒訪問到並且修改其資料,所以在對table進行put、get操作時需要加鎖,我們使用producer、consumer共享的table例項作為鎖物件。在生產出food後,我們需要判斷table是否已被放滿產品,如果已被放滿,那麼producer執行緒就需要等待,等table中有空餘空間時再放入產品,我們使用wait方法讓producer休眠並釋放獲取的鎖。如果table中有空餘空間,那麼producer會呼叫table的put方法放入乙個產品,由於放入產品前table可能為空,那麼會有consumer在等待獲取產品,所以放入產品後,producer會呼叫table.notifyall()去喚醒正在等待的consumer物件。consumer物件被喚醒後會呼叫table.getfood()方法獲取產品。consumer獲取產品的**和producer類似。
kafka同步生產者和非同步生產者深入剖析
什麼是kafka同步生產者,什麼是kafka非同步生產者?比如這裡某個topic有3個分割槽。kafka同步生產者 這個生產者寫一條訊息的時候,它就立馬傳送到某個分割槽去。kafka非同步生產者 這個生產者寫一條訊息的時候,先是寫到某個緩衝區,這個緩衝區裡的資料還沒寫到broker集群裡的某個分割槽...
生產者和消費者
package demo.one public class producerconsumerdemo 資源 class resource catch interruptedexception e this.name name count system.out.println thread.curre...
生產者和消費者
package com.yuxinyicheng.test2 生產者和消費者的問題 生產者將產品交給店員,而消費者從店員處取走產品,店員一次只能有固定數量的產品 比如 20個 如果生產者試圖生產更多的產品,店員會叫生產者停一下,如果店員中有空位放產品,再通知生產者繼續生產 如果店中沒有產品,店員會告...