java執行緒模擬生產者消費者問題

2021-07-05 15:57:25 字數 2772 閱讀 6348

所謂的生產者消費者問題,就是存在生產者和消費者兩個執行緒,當倉庫還沒滿的時候,生產者可以生產,當倉庫沒空的時候,消費者可以取走商品。

我們用例項說話:

下面,我們建立幾個類:

1、消費者--主要負責消費商品

2、生產者--負責生產商品

3、倉庫--儲存商品,用乙個變數表示倉庫裡面商品的數量。

首先,我們先用乙個程式來引出我們的話題:

package com.huai.test;

public class cpthreadtest

}class customer implements runnable

} @override

public void run() }}

class product implements runnable

} @override

public void run() }}

class ware

public static boolean isempty()

}

執行結果是:執行結果非常奇怪:從下面看出,消費者消費之後,倉庫裡面沒有產品了,可是生產者竟然說還剩下100個。為什麼會出現這麼奇怪的現象呢?多執行緒共享相同資料造成的。為了避免這樣的問題,我們應該怎麼改進我們的程式呢?請看下面:

解決方案1:

思路:把ware這個資源(這裡我把ware類稱為資源)實現同步互斥。當生產者獲得倉庫的鑰匙的時候,消費者就不能進去取走商品了,反之,當消費者獲得倉庫的鑰匙正在消費商品的時候,生產者就不能生產並存入商品了。

package com.huai.test;

public class cpthreadtest

}class customer implements runnable

} }@override

public void run() }}

class product implements runnable

} }@override

public void run() }}

class ware

public static boolean isempty()

}

部分執行結果:

consume one, left 22

consume one, left 21

consume one, left 20

consume one, left 19

consume one, left 18

consume one, left 17

consume one, left 16

consume one, left 15

consume one, left 14

consume one, left 13

consume one, left 12

consume one, left 11

consume one, left 10

consume one, left 9

consume one, left 8

consume one, left 7

consume one, left 6

consume one, left 5

consume one, left 4

consume one, left 3

consume one, left 2

consume one, left 1

consume one, left 0

product one, left 1

product one, left 2

product one, left 3

product one, left 4

product one, left 5

product one, left 6

product one, left 7

product one, left 8

product one, left 9

product one, left 10

product one, left 11

product one, left 12

解決方案2:

思路:把生產和消費這兩個動作放到倉庫裡面,原理和上面的差不多,只是同步互斥的方式不一樣。

注:在ware中,當有乙個執行緒正在執行synchronized方法的時候,其他申明了synchronized的方法也不能被其他執行緒訪問,但可以訪問非synchronized申明的方法。怎麼驗證?你可以把下面例子中的乙個synchronized去掉,就會發現列印出來的結果,相鄰兩個的數字相差不全是1.

package com.huai.test;

public class cpthreadtest

}class customer implements runnable }}

class product implements runnable }}

class ware

public static boolean isempty()

public static synchronized void doproduct() }

public static synchronized void doconsume()

}}

生產者消費者問題 JAVA模擬

public class producerconsumer 緩衝區初始化 public static void init static class monitor else catch interruptedexception e public synchronized void removepro...

生產者消費者執行緒

include include include includeusing namespace std typedef int semaphore 訊號量是一種特殊的整型變數 const int size of buffer 5 緩衝區長度 const unsigned short producers...

生產者消費者執行緒

該簡單生產者 消費者執行緒,屬於本人學習過程中的一段練習 如有不足,請指點 package com.lanqiao.demo3 author 大廣子 類說明 簡單的生產者,消費者執行緒 public class threadptcs catch interruptedexception e 退出 s...