- •Лабораторна робота №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в з курсу “Паралельне програмування”
Опанувати методику створення розподiлених програм з використанням часової синхронiзацiї паральних потокiв.
Теоретичнi вiдомостi.
Приклад використання класу CountDownLatch
Розглянемо процес вiдстеження моменту закiнчення роботи декiлькох потокiв.
При створеннi об'єкту CountDownLatch, його рахiвнику привласнюється значення кiлькостi потокiв. Пiсля цього головний потiк переводиться до стану чекання за допомогою методу await(). Усi дочiрнi потки перед закiнченням виконання свого коду за допомогою методу countDown() зменшують значення рахiвника на одиницю. Пiсля того, як значення рахiвника стане дорiвнювати 0 головний потiк виходить зi стану чекання та продовжує виконання свого коду.
Приклад вiдстеження моменту закiнчення роботи декiлькох потокiв
import java.util.concurrent.*; class StopLatchedThread extends Thread { private final CountDownLatch stopLatch; private int procNumber; public StopLatchedThread( CountDownLatch s, int n) { stopLatch = s; procNumber = n; System.out.println( "Thread(" + procNumber + "): created"); } public void run() { System.out.println( "Thread(" + procNumber + "): started"); System.out.println( "Thread(" + procNumber + "): running"); stopLatch.countDown(); System.out.println( "Thread(" + procNumber + "): stoped"); } } public class StopLatchedThreadDemo { public static void main( String args[]) { CountDownLatch stopLatch = new CountDownLatch( 3); for (int i = 0; i < 3; ++i) { StopLatchedThread t = new StopLatchedThread( stopLatch, i + 1); t.start(); } try { stopLatch.await(); } catch( InterruptedException e) { System.err.println( e.toString()); } System.out.println( "Main process stoped"); } } |
Завдання:
Розглянути, вiдкомпiлювати та запустити на виконання наведенi приклади.
З'ясувати принципи взємодiї та часової синхронiзацiї потокiв при використаннi класу CountDownLatch.
З'ясувати особливостi програмування та застосування класу CountDownLatch.
Написати паралельну програму для транспонування матрицi розмiром 4n x 4n елементiв n потоками. Для синхронiзацiї робочих потокiв використати клас CountDownLatch.
Лабораторна робота №10.
Тема: Розподiлене програмування на мовi Java з використанням обмiнникiв.
Мета:
Опанувати методику створення розподiлених програм з використанням обмiнникiв.
Теоретичнi вiдомостi.
Обмiнники
Обмiнники - це засоби синхронiзацiї, якi використовуються для обмiну iнформацiєю мiж двома потоками. Це здiйснюється за допомогою виклику методу exchange потоками, яким потрiбно обмiнятися iнформацiєю. Параметром цього методу є значення, яке потрiбно передати iншому потоку.
Приклад використання обмiнника
import java.util.concurrent.*; class DataClass { int value; String message; DataClass( int v, String s) { value = v; message = s; } int getValue() { return( value); } String getMassage() { return( message); } } class Loop implements Runnable { int counter; String name; Exchanger<DataClass> exchanger; Loop( int startValue, String id, Exchanger<DataClass> ex) { counter = startValue; name = id; exchanger = ex; System.out.println( name + ": created"); } public void run() { System.out.println( name + ": started"); DataClass data = new DataClass( counter, name); for (int i = 0; i < 3; ++i) { try { DataClass newData = exchanger.exchange( data); counter += newData.getValue(); System.out.println( name + ": from " + newData.getMassage() + ": data: " + newData.getValue() + ": state = " + counter); } catch (InterruptedException e) { System.err.println( e.toString()); } } System.out.println( name + ": ended"); } } public class ExchangerDemo { public static void main( String args[]) { System.out.println( "Main process started"); Exchanger<DataClass> exchanger = new Exchanger<DataClass>(); Loop loop1 = new Loop( 1, "First", exchanger); Loop loop2 = new Loop( 2, "Second", exchanger); new Thread( loop1).start(); new Thread( loop2).start(); System.out.println( "Main process ended"); } } |
