Лабораторная работа: Распараллеливание процессов

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Министерство образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное учреждение высшего образования

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

Кафедра Автоматизированных систем

Отчет

к лабораторной работе по дисциплине: Технологии разработки программных комплексов

Распараллеливание процессов

Выполнил:

студент группы ИСТб-17-1

г. Иркутск 2020 г.

Содержание

  • 1. Постановка задачи
  • 2. Диаграмма классов
  • 3. Спецификация классов
  • 4. Исходный код
  • 5. Результаты

1. Постановка задачи

Значения констант и реализуемые потоками функции: N=15, где N - максимальный размер буферов. Задание подразумевает использование промежуточных буферов, представляющих собой динамические массивы.

Первый поток - генерирует в буфер 30 случайных чисел из интервала от 0 до 2.

Второй поток - извлекает числа из буфера по 5 штук, начиная с первого и переводит полученное число из 3-й системы счисления в 10-ю. Результат выводится на экран.

2. Диаграмма классов

Рисунок 1. UML-диаграмма классов

3. Спецификация классов

Таблица 1. Таблица спецификаций

Имя

Назначение

Тип

Класс Main

Метод public static void main ()

generator

ссылка на первый поток

Thread

converter

ссылка на второй поток

Thread

Класс Generator

данный класс описывает и реализует модель поведения первого потока, а именно генерацию 30 случайных чисел из интервала от 0 до 2

buffer

буфер

Buffer<Integer>

bufferSize

размер буфера

int

Метод Buffer <Integer> getBuffer () - вернуть текущий буфер

Метод public void run () - запустить поток

i

счетчик итераций, номера элемента обрабатываемого первым потоком

int

t

значение, генерируемое первым потоком

int

Класс Converter

данный класс описывает и реализует модель поведения второго потока, а именно извлечение чисел из буфера по 5 штук, начиная с первого и перевод полученного числа из 3-й системы счисления в 10-ю, вывод результата на экран

buffer

буфер

Buffer<Integer>

Метод Buffer <Integer> getBuffer () - вернуть текущий буфер

Метод public void run () - запустить поток

i

счетчик итераций

int

j

Счетчик итераций

int

count

счетчик номера элемента обрабатываемого вторым потоком

int

result

результат перевода числа из 3-й системы счисления в 10-ю

double

p

счетчик индексов для перевода из 3-й системы счисления в 10-ю

int

b

хранит нулевой элемент из листа

int

4. Исходный код

Класс Main

public class Main

{

public static void main(String[] args) {

Generator generator = new Generator();

Converter converter = new Converter(generator);

System.out.println("Поток | № | Значение");

generator.start();

converter.start();

try {

generator.join();

converter.join();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

Класс Generator

public class Generator extends Thread

{

private final int bufferSize = 15;

private ArrayList<Integer> buffer = new ArrayList<>();

@Override

public void run() {

int t;

for (int i = 1; i <= 30; i++) {

synchronized (buffer) {

while (buffer.size()==bufferSize) {

try {

buffer.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

//генерация чисел от 0до 2

t = ThreadLocalRandom.current().nextInt(3);

buffer.add(t);

System.out.println("Первый " + i + " " + t);

buffer.notify();

}

}

}

public ArrayList<Integer> getBuffer() {

return buffer;

}

}

Класс Converter

public class Converter extends Thread

{

private final ArrayList<Integer> buffer;

public Converter(Generator generator)

{

buffer = generator.getBuffer();

}

@Override

public void run() {

int count = 0;

double result = 0;

for (int j = 0; j < 6; j++) {

synchronized (buffer) {

while (buffer.isEmpty()) {

try {

buffer.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

//перевод из 3-й системы счисления в 10-ю

int p = 4;

int b = 0;

for(int i=0; i<5; i++){

try {

b = buffer.get(0);

buffer.remove(0);

result += b * Math.pow(3,p);

}

p--;

}

count++;

System.out.println("Второй " + count + " " + result);

buffer.notify();

}

result = 0;

}

}

}

5. Результаты

Рисунок 2. Результаты

динамический массив поток буфер

Источник: https://otherreferats.allbest.ru/download/1245140/