A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ThreadDemo3 {
        public static void main(String[] args) {
                Resource r=new Resource("鸡腿");
                Input in=new Input(r);
                Output out=new Output(r);
                Thread t1=new Thread(in);
                Thread t2=new Thread(in);
                Thread t3=new Thread(out);
                Thread t4=new Thread(out);
                t1.start();
                t2.start();
                t3.start();
                t4.start();
               
        }

}
class Input implements Runnable
{
        private Resource r;
        Input(Resource r)
        {
                this.r=r;
        }
        public void run()
        {
                while(true)
                {
                        r.set();
                }
        }
}
class Output implements Runnable
{
        private Resource r;
        Output(Resource r)
        {
                this.r=r;
        }
        public void run()
        {
                while(true)
                {
                        r.get();
                }
        }
}
class Resource
{
        private String name;
        private Lock lock=new ReentrantLock();
        private Condition d1=lock.newCondition();
        private Condition d2=lock.newCondition();
        private boolean flag=false;
        public void set()
        {
                lock.lock();
          try
          {
                    while(flag)
                    {try{d1.await();}catch(InterruptedException e){}}
                    System.out.println(Thread.currentThread().getName()+"商品***"+name);
                    flag=true;
                    d2.signal();
            
          }finally
          {lock.unlock();}
        }
        public void get()
        {
                lock.lock();
                   try
                  {
                            while(!flag)
                            {try{d1.await();}catch(InterruptedException e){}}
                            System.out.println(Thread.currentThread().getName()+"消费***"+name);
                            flag=false;
                            d1.signal();
                   
                  }finally
                  {lock.unlock();}
        }
       
        public Resource(String name)
        {
                this.name=name;
        }
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }

}

1 个回复

倒序浏览
get方法中的
{try{d1.await();}catch(InterruptedException e){}}          d1.await()应改为d2.await() 就可以了
因为set方法和get方法都是d1.await() 都让线程到d1中等待
只会使得线程最终都在d1中等待,无法被唤醒,使程序挂在那
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马