馬士兵執行緒 消費者和生產者部分的錯誤

2021-09-01 22:57:44 字數 2453 閱讀 1567

最近看到執行緒這一章時,發現執行 消費者和生產者 **部分時,總會出現先消費生產。

源**如下:

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)

} }}

執行結果:

消費了: wotou : 0

生產了:wotou : 0

生產了:wotou : 1

生產了:wotou : 2

生產了:wotou : 3

生產了:wotou : 4

消費了: wotou : 4

生產了:wotou : 5

生產了:wotou : 6

生產了:wotou : 7

消費了: wotou : 7

生產了:wotou : 8

消費了: wotou : 8

生產了:wotou : 9

消費了: wotou : 9

生產了:wotou : 10

消費了: wotou : 10

生產了:wotou : 11

消費了: wotou : 11

生產了:wotou : 12

生產了:wotou : 13

消費了: wotou : 12

生產了:wotou : 14

消費了: wotou : 13

消費了: wotou : 14

生產了:wotou : 15

消費了: wotou : 15

生產了:wotou : 16

消費了: wotou : 16

生產了:wotou : 17

消費了: wotou : 17

生產了:wotou : 18

消費了: wotou : 18

生產了:wotou : 19

消費了: wotou : 19

消費了: wotou : 6

消費了: wotou : 5

消費了: wotou : 3

消費了: wotou : 2

消費了: wotou : 1

應該是執行緒出現問題,在push()方法結束後,要列印生產了第幾個窩頭時,另一線程執行了起來,導致消費在生產之前。

修改**:把列印部分都放進push()和pop()方法內,同時pop()方法返回型別為void。

**如下:

public class producerconsumer 

}class wotou

public string tostring()

}class syncstack catch (interruptedexception e)

} this.notifyall();

arrwt[index] = wt;

index ++;

system.out.println("生產了:" + wt); }

public synchronized void pop() catch (interruptedexception e)

} this.notifyall();

index--;

system.out.println("消費了: " + arrwt[index]); }}

class producer implements runnable

public void run() catch (interruptedexception e)

} }}class consumer implements runnable

public void run() catch (interruptedexception e)

} }}

生產者消費者執行緒

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...

執行緒的生產者消費者

新建乙個產品person package cn.lucky.producer author lucky public class person public synchronized void pop 新建生產者 package cn.lucky.producer author lucky publ...