JAVA系列:Synchronized生产者 消费者例子

    科技2026-02-19  5

    目录

    引子(一个生产者消费者)

    例子(多个生产者消费者)

    生产消费交替进行


    引子(一个生产者消费者)

    删除准备取数消费S1线程

    删除准备取数消费S2线程

    添加数据准备 生产A线程

    添加数据完成 生产A线程(发出唤醒)

    删除取数开始消费S2线程(接收唤醒)

    删除取数完成消费S2线程

    删除取数开始消费S1线程(接收唤醒)

    Exception in thread "消费S1线程" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

    at java.util.ArrayList.RangeCheck(ArrayList.java:547)

    at java.util.ArrayList.remove(ArrayList.java:387)

    at Customer.subtract(Test.java:45)

    at ThreadCustomer.run(Test.java:71)

    at java.lang.Thread.run(Thread.java:662)

     

     

    因生成之后,唤醒了全部等待的线程,结果所有的wait()后面的程序继续执行,进而出错。 

    将if( ValueObj.list.size() == 0 )改为//while( ValueObj.list.size() == 0 )后正常。

    例子(多个生产者消费者)

     

    生产完成通知,生产者:生产者A

    生产完成通知,生产者:生产者B

    生产完成通知,生产者:生产者C

    消费完成通知,消费者3

    消费完成通知,消费者1

    消费完成通知,消费者2

    生产完成通知,生产者:生产者A

    生产完成通知,生产者:生产者B

    生产完成通知,生产者:生产者C

    生产完成通知,生产者:生产者A

    生产完成通知,生产者:生产者B

    消费完成通知,消费者3

    消费完成通知,消费者2

    生产完成通知,生产者:生产者C

    消费完成通知,消费者1

    .......

     

    生产消费交替进行

     

     

    ---backA---

    ---backB---

    backA wiat

    ---backA---

    backA wiat

    backA wiat

    ---backB---

    backA wiat

    ---backA---

    backA wiat

    backA wiat

    ---backB---

     

    Processed: 0.012, SQL: 10