Автор: Пользователь скрыл имя, 16 Ноября 2011 в 22:18, лабораторная работа
Цель работы: исследовать возможности, предоставляемые системой программирования JAVA для решения задачи синхронизации «читатели и писатели».
Задание на лабораторную работу:
Разработать программу, создающую подпроцессы двух видов, осуществляющих обмен данными.
Министерство образования и науки, молодёжи и спорта Украины
Севастопольский
национальный технический университет
Отчёт
по лабораторной работе №3
на тему
«Решение задачи «Читатели и писатели»».
Вариант 10
Севастополь, 2011
Подпроцессы:
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()
StartRead();
System.out.println(t.getName()
try { Thread.sleep(50); } catch (InterruptedException e) {}
int m = calculate(n);
System.out.println(t.getName()
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()
StartWrite();
System.out.println(t.getName()
try { Thread.sleep(100); } catch (InterruptedException e) {}
this.n = n;
StopWrite();
System.out.println(t.getName()
}
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()*
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 раз