黑马程序员技术交流社区
标题:
java基础,线程????
[打印本页]
作者:
韩秀山
时间:
2013-5-15 16:51
标题:
java基础,线程????
学到了线程了,但是老师说有一个,生产者和消费者的例子不怎么好理解。希望谁能帮我写一下。。一定要有详细的注释。我好没学到那里,没注释看不懂!!!
作者:
陈雪琪
时间:
2013-5-15 18:34
import java.util.concurrent.locks.*;
class ProducerConsumerDemo2
{
public static void main(String[] args)
{
Res r=new Res();//创建一个资源对象
Producer pro=new Producer(r);//创建一个生产者
Consumer con=new Consumer(r);//创建一个消费者
Thread t1=new Thread(pro);
Thread t2=new Thread(pro);//创建以上两个线程,即两个生产者线程t1,t2
Thread t3=new Thread(con);
Thread t4=new Thread(con);//创建以上两个线程,即两个消费者线程t3,t4
t1.start();
t2.start();
t3.start();
t4.start();//开启四个线程
}
}
class Res
{
private String name;
private int count=1;
private boolean flag=false;
private Lock lock=new ReentrantLock();//创建一个锁
private Condition condition_pro=lock.newCondition();//该方法是创建一个生产者的Contion对象,目的是执行相应的线程,如只执行生产者的等待和唤醒。
private Condition condition_con=lock.newCondition();//该方法是创建一个消费者的Contion对象,目的同上。
/*这个方法是生产者生产商品的方法。*/
public synchronized void set(String name)throws InterruptedException{
lock.lock();//上锁
try{
while(flag)//若flag为true,表示已经有一个商品了,执行await语句抛出异常。若为false,表示还没有商品,生产者需要生产,则await()句不执行,执行下一句代码。
condition_pro.await();//那么此时,因为可能还没有被消费者消费,所以为了让生产者不产生新的商品,故让所以生产者线程等待。抛出异常。执行finally语句解锁。
this.name=name+"..."+(count++);
System.out.println(Thread.currentThread().getName()+"生产者..."+this.name);//可以理解为生产商品的语句。
flag=true;//以上语句的意思是生产者已经生产了一个产品,所以用flag=true告诉他们现在有一个商品了。
condition_con.signal();//唤醒所有消费者线程。
}
finally{//加上finally是为了当是否抛出异常时,都能将锁释放,要不然其他线程进不来。
lock.unlock();//解锁
}
}
/*这个方法是消费者消费商品的方法。上锁解锁的方法如上*/
public void out()throws InterruptedException{
lock.lock();
try{
while(!flag)//当flag=false时,!flag=true,表示此时容器里没有商品,消费者不能消费。故用await让所有消费者线程等待。
condition_con.await();
System.out.println(Thread.currentThread().getName()+"消费者........."+this.name);//可以理解为消费商品的语句。
flag=false;//商品消费完,容器里没有商品了,故把标记变为false.
condition_pro.signalAll();//唤醒线程池里所有的生产者线程。
}
finally{
lock.unlock();
}
}
}
class Producer implements Runnable//这个是生产者线程,创建商品。
{
private Res r;
Producer(Res r){
this.r=r;
}
public void run(){
while(true){
try{
r.set("+商品+");
}
catch(InterruptedException e){}
}
}
}
class Consumer implements Runnable//这个是消费者者线程,消费商品。
{
private Res r;
Consumer(Res r){
this.r=r;
}
public void run(){
while(true){
try{
r.out();
}
catch(InterruptedException e){}
}
}
}
复制代码
代码可以直接运行的,不知道说的会不会太乱,你能不能理解额~
作者:
袁梦希
时间:
2013-5-18 12:46
如果问题已经解决了,那么大家请把帖子的类型改为“已解决”,在自己帖子的左下角点编辑,然后选择帖子的分类进行改正
。{:soso_e163:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2