java线程学习(3)生产者、消费者(一)

2014-11-24 03:14:14 · 作者: · 浏览: 3

/*

//生产者,消费者问题(多个生产者、消费者)

class Resource

{

private String name;

private int count=1;

private boolean flag=false;

public synchronized void set(String name)

{

while(flag) //由if换成while

try{wait();}catch(Exception e){}

this.name=name+"----"+count++;

System.out.println(Thread.currentThread().getName()+"----生产者----"+this.name);

flag=true;

this.notifyAll(); //由notify换成notifyAll

}

public synchronized void out()

{

while(!flag) //由if换成while

try{wait();}catch(Exception e){}

System.out.println(Thread.currentThread().getName()+"----消费者---------"+this.name);

flag=false;

this.notifyAll();//由notify换成notifyAll

}

}

class Producer implements Runnable

{

private Resource res;

Producer(Resource res)

{

this.res=res;

}

public void run()

{

while(true)

res.set("+商品+");

}

}

class Consumer implements Runnable

{

private Resource res;

Consumer(Resource res)

{

this.res=res;

}

public void run()

{

while(true)

res.out();

}

}

class Test

{

public static void main(String[] args)

{

Resource r=new Resource();

Producer pro=new Producer(r);

Consumer con=new Consumer(r);

Thread t1=new Thread(pro);

Thread t2=new Thread(pro);

Thread t3=new Thread(con);

Thread t4=new Thread(con);

t1.start();

t2.start();

t3.start();

t4.start();

}

}

*/

/*

//jdk1.5中提供了多线程升级解决方案

//将同步synchronized替换成现实Lock操作

//将Object中的wait,notify,notifyAll替换成Condition对象

//该示例中,实现了本方只唤醒对方操作

import java.util.concurrent.locks.*;

class Resource

{

private String name;

private int count=1;

private boolean flag=false;

private Lock lock=new ReentrantLock();////

private Condition condition_pro=lock.newCondition();///

private Condition condition_con=lock.newCondition();////

public void set(String name)throws InterruptedException

{

lock.lock();////

try

{

while(flag)

condition_pro.await();///

this.name=name+"----"+count++;

System.out.println(Thread.currentThread().getName()+"----生产者----"+this.name);

flag=true;

condition_con.signal();////

}

finally

{

lock.unlock();///

}

}

public void out() throws InterruptedException

{

lock.lock();///

try

{

while(!flag) //由if换成while

condition_con.await();//

System.out.println(Thread.currentThread().getName()+"----消费者---------"+this.name);

flag=false;

condition_pro.signal();

}

finally

{

lock.unlock();

}

}

}

class Producer implements Runnable

{

private Resource res;

Producer(Resource res)

{

this.res=res;

}

public void run()

{

while(true)

try

{

res.set("+商品+");

}

catch (Exception e)