- •Лабораторна робота №2.
- •Приклад документованого тексту програми.
- •Виклик утiлiти Javadoc з командного рядка.
- •Завдання:
- •Лабораторна робота №3.
- •Теоретичнi вiдомостi.
- •Завдання
- •Iндивiдуальнi завдання до захисту роботи
- •Лабораторна робота №4.
- •Теоретичнi вiдомостi.
- •Завдання
- •Iндивiдуальнi завдання до захисту роботи
- •Рекурсивна версiя засувки
- •Завдання
- •Iндивiдуальнi завдання до захисту роботи
- •Використання семафорiв для сигналiзацiї
- •Рахуючий семафор
- •Обмежуючий семафор
- •Потоки стандартного вводу / виводу
- •Стандартний поток виводу System.Out
- •Стандартний поток вводу System.In
- •Стандартний поток помилок System.Err
- •Потоки вводу / виводу пакету java.Io
- •Файловий ввод / вивід
- •Рядковий ввод / вивід
- •Завдання:
- •Опанувати методику створення розподiлених програм з використанням часової синхронiзацiї паральних потокiв.
- •Приклад використання класу CountDownLatch
- •Опанувати методику створення розподiлених програм з використанням часової синхронiзацiї паральних потокiв.
- •Приклад вiдстеження моменту закiнчення роботи декiлькох потокiв
- •Завдання:
- •Опанувати методику створення розподiлених програм з використанням обмiнникiв.
- •Завдання:
- •Iндивiдуальнi завдання до захисту роботи
- •Мережі і сокети
- •Приклад: віддалене читання файлу
- •Сервер читання файлів мовою Java
- •Клієнт читання файлів мовою Java
- •Порядок компіляції та запуску програм
- •Завдання:
- •Контрольні питання:
- •Iндивiдуальнi завдання до захисту роботи
- •Опанувати методику створення розподiлених програм з використанням конвейеру команд.
- •Опанувати методику побудови моделi обчислень у виглядi графа "операцiї-операнди".
- •Приклад паралельного алгоритму для обчислення площi прямокутника
- •Завдання:
- •Iндивiдуальнi завдання до захисту роботи
- •Опанувати методику створення розподiлених програм з використанням портфеля задач.
- •Приклад використання портфеля задач за допомогою ExecutorService.
- •Завдання:
- •Iндивiдуальнi завдання до захисту роботи
- •Опанувати методику створення розподiлених програм з використанням бар'єрної синхронiзацiї.
- •Приклад використання бар'ера
- •Завдання:
- •Iндивiдуальнi завдання до захисту роботи
- •Опанувати методику синхронiзацiї паральних процесiв з використанням блокуючої черги.
- •Приклад реалiзацiї блокуючої черги
- •Приклад використання блокуючої черги
- •Завдання:
- •Iндивiдуальнi завдання до захисту роботи
- •Вимоги до звiту
- •Iндивiдуальнi завдання для самостiйної роботи
- •Вимоги до звiту
- •Iндивiдуальнi завдання для самостiйної роботи
- •Вимоги до звiту
- •Iндивiдуальнi завдання для самостiйної роботи
- •Додатковi завдання для пiдвищення балiв з курсу “Паралельне програмування”
Завдання:
Напишить паралельну програму, яка читає вхідний файл filename1 і записує його у стандартний вихід, а також у файл filename2, тобто створює дві копії вхідних даних. Распаралельте вашу програму так, щоб вона використовувала три процеси: читання із файлу filename1, запису у стандартний вивід и запису у файл filename.
Рекомендація: Для виконання цього завдання треба створити головний клас, у якому будуть створені (за допомогою оператора new) і запущені на виконання три класи потоків, що виконують процеси читання даних з дискового файлу, запису їх у новий файл, та виводу на консоль.
public class MultiCopy { TextBuffer buffer; MultiCopy() { System.out.println( "MultiCopy:MultiCopy()"); buffer = new TextBuffer(); WriteFile wf = new WriteFile( "File3.txt", buffer); PrintFile pf = new PrintFile( buffer); ReadFile rf = new ReadFile( "File1.txt", buffer, wf); rf.start(); wf.start(); pf.start(); } public static void main( String args[]) { System.out.println( "main"); MultiCopy mc = new MultiCopy(); } } |
Передача даних між цима потоками (класами) відбувається через четвертий клас, що виконує функції буферу.
class TextBuffer { int bufferByte; TextBuffer() { System.out.println( "TextBuffer:TextBuffer()"); bufferByte = 0; } public synchronized void setBufferByte( int b) { System.out.println( "TextBuffer:setBufferByte() \r"); bufferByte = b; } public synchronized int getBufferByte() { System.out.println( "TextBuffer:getBufferByte() \r"); return( bufferByte); } } |
У цьому класі потрібно визначити методи, за допомогою яких будуть відбуватися процеси наповнення буферу, та читання з нього. Оскільки ці методи у кожний конкретний проміжок часу можуть бути використані тільки одним единим потоком, то їх треба декларувати, як синхронізовані (synchronized).
Синхронізацію потоків можна виконати за допомогою методів wait() та notify(). За допомогою методу notify() поток, що читає дані з вхідного файлу та записує їх до буферу, повідомляє інші потоки про те, що дані вже знаходяться у буфері та доступні для считування.
class ReadFile implements Runnable { FileInputStream readFile; Thread ReadThread; TextBuffer tb = null; WriteFile writeFile; ReadFile( String fileName, TextBuffer b, WriteFile wf) { tb = b; writeFile = wf; try { readFile = new FileInputStream( fileName); } catch (FileNotFoundException fnfe1) { System.out.println( "Unable to Find Input File: " + fnfe1.toString()); System.exit( 0); } } public void start() { System.out.println( "ReadFile:start()"); ReadThread = new Thread( this); ReadThread.start(); } public void stop() { System.out.println( "ReadFile:stop()"); if (ReadThread != null) { ReadThread = null; } } public void run() { int rbyte; System.out.println( "ReadFile:run()"); try { while ((rbyte = readFile.read()) != -1) { tb.setBufferByte( rbyte); synchronized( writeFile) { writeFile.notify(); } try { Thread.sleep( 50); } catch (InterruptedException ee) { System.out.println( "Interrupted Exception: " + ee.toString()); } } tb.setBufferByte( -1); synchronized( writeFile) { writeFile.notify(); } } catch (IOException ioe) { System.out.println( "Unable to read: " + ioe.toString()); } } } |
Інші потоки чекають це повідомлення за допомогою методу wait().
class WriteFile implements Runnable { FileOutputStream writeFile; Thread WriteThread; TextBuffer tb = null; WriteFile( String fileName, TextBuffer b) { System.out.println( "WriteFile:WriteFile()"); tb = b; try { writeFile = new FileOutputStream( fileName); } catch (FileNotFoundException fnfe1) { System.out.println( "Unable to Find Output File: " + fnfe1.toString()); System.exit( 0); } } public void start() { System.out.println( "WriteFile:start()"); WriteThread = new Thread( this); WriteThread.start(); } public void stop() { System.out.println( "WriteFile:stop()"); if (WriteThread != null) { WriteThread = null; } } public synchronized void run() { int rbyte; System.out.println( "WriteFile:run()"); try { do { try { wait(); } catch (InterruptedException ee) { System.out.println( "Interrupted Exception: " + ee.toString()); } rbyte = tb.getBufferByte(); writeFile.write( rbyte); } while (rbyte != -1); } catch (IOException ioe) { System.out.println( "Unable to write: " + ioe.toString()); } } } |
Лабораторна робота №8.
Тема: Розподiлене програмування на мовi Java з синхронiзацiєю за часом виконання паральних потокiв (Одночасний запуск потокiв).
Мета:
