Java多线程同步——生产者消费者问题

这是马士兵老师的Java视频教程里的一个生产者消费者问题的模型

  1. public class ProduceConsumer{
  2. public static void main(String[] args){
  3. SyncStack ss = new SyncStack();
  4. Producer pro = new Producer(ss);
  5. Consumer con = new Consumer(ss);
  6. new Thread(pro).start();
  7. new Thread(con).start();
  8. }
  9. }
  10. class Product{
  11. int id;
  12. public Product(int id){
  13. this.id = id;
  14. }
  15. public String toString(){
  16. return "Product:" + id;
  17. }
  18. }
  19. class SyncStack{
  20. int index  = 0;
  21. Product[] arrPro = new Product[6];
  22. public synchronized void push(Product p){
  23. while (index == arrPro.length){
  24. try {
  25. this.wait();
  26. } catch (InterruptedException e) {
  27. // TODO Auto-generated catch block
  28. e.printStackTrace();
  29. }
  30. }
  31. this.notify();
  32. arrPro[index] = p;
  33. index++;
  34. }
  35. public synchronized Product pop(){
  36. while (index == 0){
  37. try {
  38. this.wait();
  39. } catch (InterruptedException e) {
  40. // TODO Auto-generated catch block
  41. e.printStackTrace();
  42. }
  43. }
  44. this.notify();
  45. index--;
  46. return arrPro[index];
  47. }
  48. }
  49. class Producer implements Runnable{
  50. SyncStack ss = null;
  51. public Producer(SyncStack ss){ //持有SyncStack的一个引用
  52. this.ss = ss;
  53. }
  54. @Override
  55. public void run() {
  56. for(int i=0; i<20; i++){
  57. Product p = new Product(i);
  58. ss.push(p);
  59. System.out.println("生产了:" + p);
  60. try {
  61. Thread.sleep(100);
  62. } catch (InterruptedException e) {
  63. e.printStackTrace();
  64. }
  65. }
  66. }
  67. }
  68. class Consumer implements Runnable{
  69. SyncStack ss = null;
  70. public Consumer(SyncStack ss){ //持有SyncStack的一个引用
  71. this.ss = ss;
  72. }
  73. @Override
  74. public void run() {
  75. for(int i=0; i<20; i++){
  76. Product p = ss.pop();
  77. System.out.println("消费了:" + p);
  78. try {
  79. Thread.sleep(1000);
  80. } catch (InterruptedException e) {
  81. e.printStackTrace();
  82. }
  83. }
  84. }
  85. }
上一篇:ALV 行列 颜色


下一篇:Scrapy 1.4 文档 02 安装指南