package shapes;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.Condition;
class Res
{
String name;
int i;
Container c;
//Res(String name,int i)
//{
//this.name=name;
//this.i=i;
//}
public String toString()
{
return(this.name+i);
}
public void get(String string, int i2) {
name=string;
i=i2;
}
}
class Container
{
Lock lock=new ReentrantLock();
private Condition con1=lock.newCondition();
private Condition con2=lock.newCondition();
int count,puter,geter;
//count代表容器中面包的数目,puter代表容器中放置的位置,geter代表拿的位置;
Object a[]=new Object[20];
public void put(Object o)
{
lock.lock();
try {
while(count==a.length)
{try{con1.await();}catch(Exception e) {}}
count++;
a[puter]=o;
System.out.println(Thread.currentThread().getName()+"生产了"+o.toString());
//放置到容器最后一行就从头开始放置
if(++puter==a.length)
{puter=0;}
//容器每放入一个对象,都释放一次消费者的进程,以确保消费者可以消费
con2.signal();
}
finally
{
lock.unlock();
}
}
public void get()
{
lock.lock();
try {
while(count==0)
{try{con2.await();}catch(Exception e) {}}
count--;
System.out.println(Thread.currentThread().getName()+"消费了"+a[geter].toString());
//a[geter]=null;
//拿走容器最后一个位置的对象就从头开始拿
geter++;
if(++geter==a.length)
{puter=0;}
//容器每拿走一个对象,都释放一次生产者的进程,以确保消费者可以消费
con1.signal();
}
finally
{
lock.unlock();
}
}
}
class Produce implements Runnable
{
Res r;
Container c;
Produce(Res r)
{
this.r=r;
}
public void run()
{
for(int i=1;i<40;i++)
{
r.get("面包",i);
c.put(r);
}
}
}
class Consumer implements Runnable
{
Res r;
Container c;
Consumer(Res r)
{
this.r=r;
}
public void run()
{
for(int i=0;i<40;i++)
c.get();
}
}
class Main
{
public static void main(String []args)
{
Res r=new Res();
Produce p=new Produce(r);
Consumer c=new Consumer(r);
Thread t0=new Thread(p);
Thread t1=new Thread(p);
Thread t2=new Thread(c);
Thread t3=new Thread(c);
t0.start();
t1.start();
t2.start();
t3.start();
}
}
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.Condition;
class Res
{
String name;
int i;
Container c;
//Res(String name,int i)
//{
//this.name=name;
//this.i=i;
//}
public String toString()
{
return(this.name+i);
}
public void get(String string, int i2) {
name=string;
i=i2;
}
}
class Container
{
Lock lock=new ReentrantLock();
private Condition con1=lock.newCondition();
private Condition con2=lock.newCondition();
int count,puter,geter;
//count代表容器中面包的数目,puter代表容器中放置的位置,geter代表拿的位置;
Object a[]=new Object[20];
public void put(Object o)
{
lock.lock();
try {
while(count==a.length)
{try{con1.await();}catch(Exception e) {}}
count++;
a[puter]=o;
System.out.println(Thread.currentThread().getName()+"生产了"+o.toString());
//放置到容器最后一行就从头开始放置
if(++puter==a.length)
{puter=0;}
//容器每放入一个对象,都释放一次消费者的进程,以确保消费者可以消费
con2.signal();
}
finally
{
lock.unlock();
}
}
public void get()
{
lock.lock();
try {
while(count==0)
{try{con2.await();}catch(Exception e) {}}
count--;
System.out.println(Thread.currentThread().getName()+"消费了"+a[geter].toString());
//a[geter]=null;
//拿走容器最后一个位置的对象就从头开始拿
geter++;
if(++geter==a.length)
{puter=0;}
//容器每拿走一个对象,都释放一次生产者的进程,以确保消费者可以消费
con1.signal();
}
finally
{
lock.unlock();
}
}
}
class Produce implements Runnable
{
Res r;
Container c;
Produce(Res r)
{
this.r=r;
}
public void run()
{
for(int i=1;i<40;i++)
{
r.get("面包",i);
c.put(r);
}
}
}
class Consumer implements Runnable
{
Res r;
Container c;
Consumer(Res r)
{
this.r=r;
}
public void run()
{
for(int i=0;i<40;i++)
c.get();
}
}
class Main
{
public static void main(String []args)
{
Res r=new Res();
Produce p=new Produce(r);
Consumer c=new Consumer(r);
Thread t0=new Thread(p);
Thread t1=new Thread(p);
Thread t2=new Thread(c);
Thread t3=new Thread(c);
t0.start();
t1.start();
t2.start();
t3.start();
}
}