Решение задачи «Читатели и писатели»

Автор: Пользователь скрыл имя, 16 Ноября 2011 в 22:18, лабораторная работа

Описание работы

Цель работы: исследовать возможности, предоставляемые системой программирования JAVA для решения задачи синхронизации «читатели и писатели».
Задание на лабораторную работу:

Разработать программу, создающую подпроцессы двух видов, осуществляющих обмен данными.

Работа содержит 1 файл

Лаба №3(ПиРВ).doc

— 50.00 Кб (Скачать)

Министерство  образования и науки, молодёжи и  спорта Украины

Севастопольский национальный технический университет 
 
 
 
 
 
 

                                                                                                     Кафедра кибернетики

                                                                                                     и вычислительной техники 
 
 
 
 
 
 
 
 

Отчёт

по лабораторной работе №3

на тему «Решение задачи «Читатели и писатели»». 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

                                                                                                           Выполнил: ст. гр. М-32

                                                                                                           Маслов В.О.

                                                                                                           Проверил: Абрамов Т.А.

                        Вариант 10 
                   
                   
                   
                   
                   

Севастополь, 2011

Цель  работы: исследовать возможности, предоставляемые системой программирования JAVA для решения задачи синхронизации «читатели и писатели».

    Задание на лабораторную работу:

 
  1. Разработать программу, создающую подпроцессы  двух видов, осуществляющих обмен данными.

Подпроцессы:

    1) Генерация  последовательности целых случайных  чисел

      2) Максимальное значение

  1. Исследовать поведение программы при использовании различных методов синхронизации (событийные переменные, семафоры)
  2. Проанализировать полученные результаты.
 

Текст программы:

class PC

{

  public static void main(String args[]) {

    Q q = new Q();

    Writer w1 = new Writer(q,1);

    Writer w2 = new Writer(q,2);   

    Writer w3 = new Writer(q,3);

    Writer w4 = new Writer(q,4);

    Reader r1 = new Reader(q,1);

    Reader r2 = new Reader(q,2);   

    Reader r3 = new Reader(q,3);

    Reader r4 = new Reader(q,4);    

    try {Thread.sleep(5000);}     catch(InterruptedException e) {};    

    q.work = false;

    try {Thread.sleep(500);}     catch(InterruptedException e) {} ;

    System.out.println

(   

        "Писатель 1 выполнился: "+w1.i+" раз\n" +

        "Писатель 2 выполнился: "+w2.i+" раз\n" +

        "Писатель 3 выполнился: "+w3.i+" раз\n" +

        "Писатель 4 выполнился: "+w4.i+" раз\n" +

        "Читатель 1 выполнился: "+r1.i+" раз\n" +

        "Читатель 2 выполнился: "+r2.i+" раз\n" +

        "Читатель 3 выполнился: "+r3.i+" раз\n" +

        "Читатель 4 выполнился: "+r4.i+" раз\n"  

    );

  }

}

class Q

{

  int [] n = new int[10];

  boolean work = true; 

 

  //final Lock lock = new ReentrantLock();

  //final Condition ReaderCanStart = lock.newCondition();

  //final Condition WriterCanStart = lock.newCondition();

  Semaphore ReaderCanStart=new Semaphore(0,true);

  Semaphore WriterCanStart=new Semaphore(0,true);

  int WaitingReader = 0; int RunningReader = 0;

  int WaitingWriter = 0; int RunningWriter = 0;  

  int read()

  {

    Thread t = Thread.currentThread(); 

    System.out.println(t.getName()+" try...");

    StartRead();

    System.out.println(t.getName()+" reading...");

    try { Thread.sleep(50); } catch (InterruptedException e) {}

    int m = calculate(n);

    System.out.println(t.getName()+": "+m);

    StopRead();

    return m;

  }

  void StartRead()  

  {

     //lock.lock();

     //try

     //{

         if ((RunningWriter>0) )

         {

             WaitingReader++;      

     //      try { ReaderCanStart.await(); } catch (InterruptedException e) {}   

             try {ReaderCanStart.acquire();} catch(InterruptedException e){}

         }

         else

             RunningReader++;

     //}

     //finally {lock.unlock();}

  } 

  void StopRead()

  {

     //lock.lock();    

     //try

     //{

        RunningReader--;

        if ((RunningReader==0) & (WaitingWriter>0))

        {

            WaitingWriter--; 

            RunningWriter++;

            WriterCanStart.release();

     //     WriterCanStart.signal();   

        }

     //}

     //finally {lock.unlock();}

  }

 

  void write(int [] n)

  {

    Thread t = Thread.currentThread();  

    System.out.println(t.getName()+" try...");

    StartWrite();

    System.out.println(t.getName()+" writing...");   

    try { Thread.sleep(100); } catch (InterruptedException e) {}  

    this.n = n;

    StopWrite();

    System.out.println(t.getName()+": "+toS(n)); 

  }

  void StartWrite()

  {

      //lock.lock();

      //try

      //{

           if ((RunningWriter>0) | (RunningReader>0))

           {

               WaitingWriter++;     

      //       try { WriterCanStart.await(); } catch (InterruptedException e) {}   

               try {WriterCanStart.acquire();} catch(InterruptedException e){} 

           }  

           else RunningWriter++;

      //}

      //finally {lock.unlock();} 

  }

  void StopWrite()

  {

     //lock.lock();

     //try

     //{

         RunningWriter--;

         if (WaitingReader>0)

         {

            while (WaitingReader>0)

            {

                RunningReader++; 

                WaitingReader--; 

     //         ReaderCanStart.signal();

                ReaderCanStart.release();

            }

        }

        else

            if (WaitingWriter>0)

            {

                WaitingWriter--;        

                RunningWriter++;

     //         WriterCanStart.signal();

                WriterCanStart.release();

            } 

     //}

     //finally {lock.unlock();} 

  }  

  String toS(int [] n)

  {

      String s="";

      for(int i=0; i<n.length; i++)

        s+=n[i]+" ";

      return s;

  }

   public int calculate(int [] m)

  {

      int min=Integer.MAX_VALUE;

      for(int i=0; i<m.length; i++){

        if(m[i]<min)

          min=m[i];

        }

      return min;

  }

}

class Writer implements Runnable

{

  Q q;

  int i=0;

  Writer(Q q,int num)

  {

    this.q = q;

    new Thread(this, "Writer "+num).start();

  }

  public void run()

  {

    while (q.work) {q.write(creatRandom(10)); i++;}

  }

  private int[] creatRandom(int n)

  {

      int [] m = new int[n];

      for(int i=0; i<n; i++)

        m[i] = (int)Math.round(Math.random()*100);

      return m;

  }

}

class Reader implements Runnable

{

  Q q;

  int i=0;

  Reader(Q q, int num)

  {     

    this.q = q;

    new Thread(this, "Reader "+num).start();

  }

  public void run()

  {

    while (q.work) { q.read(); i++;}

  }

} 

 Тестирование программы:

1) Программа работает 3 секунды (приоритет читатели), число писателей 4, число читателей 4.

Writer 4 try...

Writer 4 writing...

Writer 3 try...

Writer 2 try...

Writer 1 try...

Reader 2 try...

Reader 4 try...

Reader 1 try...

Reader 3 try...

Reader 2 reading...

Reader 4 reading...

Writer 4: 74 31 27 67 32 29 33 65 37 58

Writer 4 try...

Reader 1 reading...

Reader 3 reading...

Reader 2: 27

Reader 2 try...

Reader 2 reading...

Reader 4: 27

Reader 4 try...

….......................

Reader 4: 0

Reader 4 try...

Reader 4 reading...

Reader 2: 0

Reader 2 try...

Reader 2 reading...

Reader 4: 0

Reader 2: 0

Reader 1: 0

Reader 3: 0

Writer 2 writing...

Writer 2: 66 89 6 84 2 24 31 73 95 89

Writer 1 writing...

Writer 4 writing...

Writer 1: 63 18 25 42 75 36 24 66 80 0

Writer 4: 55 25 27 81 9 81 74 35 89 78

Writer 3 writing...

Writer 3: 14 88 8 0 3 14 42 92 69 35

Писатель 1 выполнился: 1 раз

Писатель 2 выполнился: 1 раз

Писатель 3 выполнился: 2 раз

Информация о работе Решение задачи «Читатели и писатели»