最近看到執行緒這一章時,發現執行 消費者和生產者 **部分時,總會出現先消費後生產。
源**如下:
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...