用java智能锁远程,从生产者-消费者模型了解线程、同步、锁(java)
代碼主要包括4個類和1個測試類:
1、Egg 類: 雞蛋,可以由生產(chǎn)者放入到籃子中,供消費者消費食用。
2、Blanket 類:一個籃子,最多能裝5個雞蛋。
3、Producer 類: 生產(chǎn)者(可以有1個或多個,但一次只能由一個人放入1個),負責把雞蛋放入到籃子中。
4、Customer 類 :消費者(可以有1個或多個,但一次只能由一個人吃1個), 會把籃子里的雞蛋取走食用。
5、Tester 類 : 用于測試,可設置多個生產(chǎn)者和消費者。
1、Egg類,有一個ID屬性,用于標識生產(chǎn)和消費的雞蛋是哪一個雞蛋,直觀一點:
public class Egg {
int id;
public Egg (int id) {
this.id = id;
}
public String toString () {
return "雞蛋" + id;
}
}
2、Blanket類,其中的放入雞蛋(add)和吃雞蛋(eat)方法使用了同步鎖,即同一時間內只能由一個人操作籃子,放入雞蛋或吃雞蛋:
public class Blanket {
int count = 0;
Egg [] eggs = new Egg[5];
public synchronized void eat() {
while(count == 0){
try{
this.wait();//當籃子里雞蛋數(shù)目為0時,等待生產(chǎn)者放入雞蛋
}catch(InterruptedException ex) {
ex.printStackTrace();
}
}
this.count--;
System.out.println(Thread.currentThread().getName() + "吃了"+this.eggs[count].toString());
this.notifyAll();
}
public synchronized void add(Egg e) {
while(count == 5){
try {
this.wait();//當籃子里有5個雞蛋時,先休息
}catch(InterruptedException ex){
ex.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "生產(chǎn)了:" + e.toString());
this.eggs[count] = e;//生產(chǎn)雞蛋
count++;
this.notifyAll();//喚醒消費者
}
}
3、Producer 類,繼承Runable的生產(chǎn)者,在條件允許(籃子雞蛋未滿)的情況不停的放入雞蛋:
public class Producer implements Runnable{
Blanket blanket;
public Producer(Blanket blanket) {
this.blanket = blanket;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
int i = blanket.count;
Egg e = new Egg(i);
blanket.add(e);
try {
Thread.sleep((int)(Math.random()*1000));
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
}
4、Customer 類 ,繼承Runable 的消費者,在籃子里有雞蛋的時候就會去取出來吃:
public class Customer implements Runnable {
Blanket blanket;
public Customer(Blanket blanket) {
this.blanket = blanket;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
blanket.eat();
try{
Thread.sleep((int)(Math.random()*2800));
}catch(InterruptedException ex){
ex.printStackTrace();
}
}
}
}
5、Tester 類,用于進行測試,定義一個籃子,和1個或多個生產(chǎn)者,消費者,使這些生產(chǎn)者和消費者共用一個籃子:
public class Tester {
public static void main(String[] args) {
// TODO Auto-generated method stub
Blanket b = new Blanket();
Producer p = new Producer(b);
Producer q = new Producer(b);
Customer c = new Customer(b);
Customer d = new Customer(b);
Customer e = new Customer(b);
Customer f = new Customer(b);
new Thread(p,"生產(chǎn)者A").start();
new Thread(q,"生產(chǎn)者B").start();
new Thread(c,"消費者A").start();
new Thread(d,"消費者B").start();
new Thread(e,"消費者C").start();
new Thread(f,"消費者D").start();
}
}
上面的程序運行效果如下:
生產(chǎn)者A生產(chǎn)了:雞蛋0
消費者A吃了雞蛋0
生產(chǎn)者B生產(chǎn)了:雞蛋0
消費者B吃了雞蛋0
生產(chǎn)者A生產(chǎn)了:雞蛋0
消費者D吃了雞蛋0
生產(chǎn)者A生產(chǎn)了:雞蛋0
消費者C吃了雞蛋0
生產(chǎn)者A生產(chǎn)了:雞蛋0
生產(chǎn)者B生產(chǎn)了:雞蛋1
消費者D吃了雞蛋1
生產(chǎn)者B生產(chǎn)了:雞蛋1
生產(chǎn)者A生產(chǎn)了:雞蛋2
生產(chǎn)者A生產(chǎn)了:雞蛋3
生產(chǎn)者A生產(chǎn)了:雞蛋4
消費者B吃了雞蛋4
生產(chǎn)者B生產(chǎn)了:雞蛋5
消費者A吃了雞蛋5
生產(chǎn)者A生產(chǎn)了:雞蛋5
消費者B吃了雞蛋5
它將不停的運行下去,不會出現(xiàn)死鎖。代碼的同步(synchronized)模塊設置在共用的資源(籃子)中,每次只能由一名生產(chǎn)者或者消費者操作籃子,其他人處于等待(wait)狀態(tài),等它操作完了,它才通知其他人(notifyAll),其它人則通過競爭,然后只有一個競爭勝利的可以操作籃子,如此循環(huán)。
總結
以上是生活随笔為你收集整理的用java智能锁远程,从生产者-消费者模型了解线程、同步、锁(java)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php str_replace多个参数,
- 下一篇: php分页循环生成htnl,PHP分页类