![]() |
#2
Manshow2016-02-21 00:30
|

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);
}*/
}
}
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已取走