Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования
Иркутский национальный исследовательский технический университет
Кафедра Автоматизированных систем
Отчет
к лабораторной работе по дисциплине: Технологии разработки программных комплексов
Распараллеливание процессов
Выполнил:
студент группы ИСТб-17-1
г. Иркутск 2020 г.
Содержание
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. Результаты
динамический массив поток буфер