本题程序中实现了一个“生产者一消费者问题”。生产者产生一个随机数存入DataPool类中,消费者从中取出数据。DataPool类一次只能存放一个数据。请更正题中带下划线的部分。 注意:不改变程序的结构,不得增行或删行。 class DataPo

admin2009-12-22  46

问题 本题程序中实现了一个“生产者一消费者问题”。生产者产生一个随机数存入DataPool类中,消费者从中取出数据。DataPool类一次只能存放一个数据。请更正题中带下划线的部分。
   注意:不改变程序的结构,不得增行或删行。
   class DataPool
   {
      private int data;
      private boolean isFull;
      public DataPool()
      {
         isFull=false;
      }
      public synchronized void putData(int d)
      {
         if(isFull= =true)
         {
            try
            {
               this.notify();
            }
            catch(InterruptedException e)
            {}
         }
         data=d;
         isFull=true;
         System.out.println("生产了一个数据:"+data);
         this.notify();
      }
      public synchronized int getData()
      {
         if(isFull= =false)
         {
            try
            {
               this.wait();
            }
            catch(InterruptedException e)
            {}
         }
         isFull=false;
         System.out.println("消费了一个数据"+data);
         this.wait();
         return this.data;
      }
      boolean getIsFull()
      {
         return isFull;
      }
   }
   class Producer extends Thread
   {
      DataPool pool;
      public Producer(DataPool pool)
      {
         this.pool=pool;
      }
      public void run()
      {
         for(int i=0; i<10; i++)
         {
            int data=(int) (Math.random()*1000);
            try
            {//用于生产数据
               sleep(data);
            }
            catch(InterruptedException e)
            {}
            pool.putData(data);
         }
      }
   }
   class Consumer implements Runnable
   {
      DataPool pool;
      public Consumer(DataPool pool)
      {
         this.pool=pool;
      }
      public void run()
      {
         for(int i=0; i<10; i++)
         {
            int data=pool.getData();
            try
            {//用于处理数据
               sleep((int) (Math.random()*1000));
            }
            catch(InterruptedException e)
            {}
         }
      }
   }
   public class advance
   }
      public static void main(String[] args)
      {
         Data Pool pool=new Data Pool();
         Producer pro=new Producer(pool);
         Runnable con=new Consumer(pool);
         Thread conTh=new Thread(con);
         pro.start();
         conTh.start();
      }
   }

选项

答案this.wait() this.notify() thread.sleep((int)(Math.random()*1000))

解析 本题考查知识点:多线程同步与互斥、线程的概念和实现方法。解题思路:Data Pool是一个用来存放数据的缓冲池,其中可以存放一个血型数据,变量isFull作为标志量,标志该缓冲池中是否有数据。Put Data()方法负责向Data Pool中存放数据,本方法调用成功,缓冲池中就存入了数据,getData()方法负责从DataPool中获得数据,本方法调用成功,缓冲池就为空。Producer类负责产生随机数据,然后将数据存放到DataPool中。Consumer类负责才能够从DataPool中取出数据。Producer和Consumer共享同一个Data Pool对象。当某个线程进入synchronized块后,共享的数据并不一定能满足该线程的需要,这样线程就需要等待其他线程修改共享数据,直到满足需要以后才继续执行,但是当前线程必须释放锁以使得其他线程可以运行。wait()和notify()方法是实现线程之间通信的两个方法。wait()用来释放线程拥有的锁,使线程进入等待队列;notify()用来唤醒等待队列中的线程,并把它加入到申请锁的队列。本题中生产者在DataPool有数据的情况下需要进入等待消费者取出数据,所以需要调用wait()方法,因此第1个下划线的地方应该改为this.wait()。消费者线程在取出数据以后,必须通知生产者线程DataPool中已经没有数据了,因此第2个下划线的地方改为this.notify()。第3个下划线的地方,考查常用的线程类的使用。Runnable接口的目的是使任何类都可以为线程提供线程体,但它本身并不是线程,所以并不能直接调用Thread类的方法,需要改为 thread.sleep。
转载请注明原文地址:https://jikaoti.com/ti/QQb0FFFM
0

最新回复(0)