新手才学到线程 遇到一小问题想不明白 求大神解决
程序代码:
import java.util.concurrent.locks.*; class BoundedBuffer { final Lock lock=new ReentrantLock(); final Condition notFull=lock.newCondition(); final Condition notEmpty=lock.newCondition(); final Object[] items=new Object[100]; int putptr,takeptr,count,n; public void put(Object x) { lock.lock(); try { while(count==items.length) { try{notFull.await();}catch(InterruptedException e){} } items[putptr]=x; if(++putptr==items.length) putptr=0; count++; System.out.println(Thread.currentThread().getName()+"第"+count+"个object生产完毕"); if(count==100) System.out.println(); notEmpty.signal(); } finally { lock.unlock(); } } public Object take() { lock.lock(); try { while(count==0) { try{notEmpty.await();}catch(InterruptedException e){} } Object x=items[takeptr]; if(++takeptr==items.length) takeptr=0; System.out.println(Thread.currentThread().getName()+"第"+count+"个object已取走"); if(count==1) System.out.println(); count--; notFull.signal(); return x; } finally { lock.unlock(); } } } class Producer implements Runnable { Object x=new Object(); BoundedBuffer r; Producer(BoundedBuffer r) { this.r=r; } private boolean flag=true; public void run() { while(flag) r.put(x); } public void getFlag() { flag=false; } } class Consumer implements Runnable { BoundedBuffer r; Consumer(BoundedBuffer r) { this.r=r; } private boolean flag=true; public void run() { while(flag) r.take(); } public void getFlag() { flag=false; } } class ObjectDemo { public static void main(String[] args) { BoundedBuffer r=new BoundedBuffer(); Producer pro=new Producer(r); Consumer con=new Consumer(r); Thread t0=new Thread(pro); Thread t1=new Thread(pro); Thread t2=new Thread(con); Thread t3=new Thread(con); t0.start(); t1.start(); t2.start(); t3.start(); /*int x=0; while(true) { if(x++==10000000) { pro.getFlag(); con.getFlag(); break; } //System.out.println(x); }*/ } }
这是运行结果(线程0,执行到54时,就换线程2运行了,不是应该到100才会换t2和t3运行吗?而换成一个pro和一个con就不会出现这样的情况,求解啊)
Thread-0第1个object生产完毕
Thread-0第2个object生产完毕
Thread-0第3个object生产完毕
Thread-0第4个object生产完毕
Thread-0第5个object生产完毕
Thread-0第6个object生产完毕
Thread-0第7个object生产完毕
Thread-0第8个object生产完毕
Thread-0第9个object生产完毕
Thread-0第10个object生产完毕
Thread-0第11个object生产完毕
Thread-0第12个object生产完毕
Thread-0第13个object生产完毕
Thread-0第14个object生产完毕
Thread-0第15个object生产完毕
Thread-0第16个object生产完毕
Thread-0第17个object生产完毕
Thread-0第18个object生产完毕
Thread-0第19个object生产完毕
Thread-0第20个object生产完毕
Thread-0第21个object生产完毕
Thread-0第22个object生产完毕
Thread-0第23个object生产完毕
Thread-0第24个object生产完毕
Thread-0第25个object生产完毕
Thread-0第26个object生产完毕
Thread-0第27个object生产完毕
Thread-0第28个object生产完毕
Thread-0第29个object生产完毕
Thread-0第30个object生产完毕
Thread-0第31个object生产完毕
Thread-0第32个object生产完毕
Thread-0第33个object生产完毕
Thread-0第34个object生产完毕
Thread-0第35个object生产完毕
Thread-0第36个object生产完毕
Thread-0第37个object生产完毕
Thread-0第38个object生产完毕
Thread-0第39个object生产完毕
Thread-0第40个object生产完毕
Thread-0第41个object生产完毕
Thread-0第42个object生产完毕
Thread-0第43个object生产完毕
Thread-0第44个object生产完毕
Thread-0第45个object生产完毕
Thread-0第46个object生产完毕
Thread-0第47个object生产完毕
Thread-0第48个object生产完毕
Thread-0第49个object生产完毕
Thread-0第50个object生产完毕
Thread-0第51个object生产完毕
Thread-0第52个object生产完毕
Thread-0第53个object生产完毕
Thread-0第54个object生产完毕
Thread-2第54个object已取走
Thread-2第53个object已取走
Thread-2第52个object已取走
Thread-2第51个object已取走
Thread-2第50个object已取走
Thread-2第49个object已取走
Thread-2第48个object已取走
Thread-2第47个object已取走
Thread-2第46个object已取走
Thread-2第45个object已取走
Thread-2第44个object已取走
Thread-2第43个object已取走
Thread-2第42个object已取走
Thread-2第41个object已取走
Thread-2第40个object已取走
Thread-2第39个object已取走
Thread-2第38个object已取走
Thread-2第37个object已取走
Thread-2第36个object已取走
Thread-2第35个object已取走
Thread-2第34个object已取走
Thread-2第33个object已取走
Thread-2第32个object已取走
Thread-2第31个object已取走
Thread-2第30个object已取走
Thread-2第29个object已取走
Thread-2第28个object已取走
Thread-2第27个object已取走
Thread-2第26个object已取走
Thread-2第25个object已取走
Thread-2第24个object已取走
Thread-2第23个object已取走
Thread-2第22个object已取走
Thread-2第21个object已取走
Thread-2第20个object已取走
Thread-2第19个object已取走
Thread-2第18个object已取走
Thread-2第17个object已取走
Thread-2第16个object已取走
Thread-2第15个object已取走
Thread-2第14个object已取走
Thread-2第13个object已取走
Thread-2第12个object已取走
Thread-2第11个object已取走
Thread-2第10个object已取走
Thread-2第9个object已取走
Thread-2第8个object已取走
Thread-2第7个object已取走
Thread-2第6个object已取走
Thread-2第5个object已取走
Thread-2第4个object已取走
Thread-2第3个object已取走
Thread-2第2个object已取走
Thread-2第1个object已取走