Багатопотоковість в Java
Автор: Владислав Муравський • Февраль 20, 2022 • Лабораторная работа • 1,842 Слов (8 Страниц) • 225 Просмотры
Кафедра САПР
[pic 1]
Лабораторна робота №9
“ Багатопотоковість в Java”
з дисципліни “Об’єктно-орієнтоване програмування”
Варіант №7
Виконав:
ст. гр. КН-108
Муравський Владислав
Прийняв асистент:
Спас Н.Я
Львів-2020
Мета роботи : одержати основні навички роботи з потоками в мові Java
Лабораторне завдання
Програма моделює обслуговування двох потоків процесів з різними параметрами, можна запускати один потік за іншим. Якщо згенерувати процес першого потоку, а потім другого, то другий потік знищує процеси першого потоку. Якщо згенерувати спочатку процес другого потоку, то процес першого потоку повинен перервати процес другого потоку, після завершення процесу першого потоку, другий продовжує свою роботу. Визначити максимальну довжину черги, для всіх випадків, відсоток знищених процесів для першого потоку і відсоток перерваних запитів для другого потоку.
package lab9;
import java.util.Scanner;
public class FirstThread extends Thread {
/* * Це перший потік, він знаходить * значення суми косинусів */
String name;
int iterator;
public FirstThread(String name) {
this.name = name;
}
public FirstThread() {
}
public int getIterator() {
return iterator;
}
public void setIterator(int iterator) {
this.iterator = iterator;
}
@Override
public void run() {
long start = System.nanoTime();
double sum = 0;
for(int i = 0; i < 15000_0000; i++) {
sum += Math.cos(i);
setIterator(i);
}
long finish = System.nanoTime();
System.out.println("Summation of cos: " + sum);
System.out.println("Time of work: " + (finish - start)/(1000_000_000));
}
}
package lab9;
public class SecondThread extends Thread {
/* * Це другий потік, він знаходить * значення суми синусів */
String name;
int iterator;
public SecondThread(String name) {
this.name = name;
}
public int getIterator() {
return iterator;
}
}
public void setIterator(int iterator) {
this.iterator = iterator;
}
@Override
public void run() {
long start = System.nanoTime();
double sum = 0;
for (int i = 0; i < 25000_0000; i++) {
sum += Math.sin(i); setIterator(i);
} long finish = System.nanoTime();
System.out.println("Summation of sin: " + sum);
System.out.println("Time of work: " + (finish - start)/(1000_000_000));
}
package lab9;
import java.util.Scanner;
public class Runner {
private FirstThread firstThread = new FirstThread("Потік --- 1");
private SecondThread secondThread = new SecondThread("Потік --- 2");
private static int lenghtOfQueue;
private static int interruptedProcess;
private int stopedProcess;
public static void main(String[] args) {
Runner runner = new Runner();
Scanner scan = new Scanner(System.in);
System.out.println("Який потік запускати?"); int n = scan.nextInt();
System.out.println("Запускати інший поток також?");
System.out.println("так - true, ні - false");
boolean flag = scan.nextBoolean();
if (n != 1 && n != 2) { System.out.println("Такого потоку немає");
return; } else if (n == 1) runner.startThreadFirst(flag);
else if (n == 2) { runner.startThreadSecond(flag);
}
}
@SuppressWarnings
("deprecation")
private void startThreadFirst(boolean flag) {
if (!flag) { lenghtOfQueue = 15000_0000;
firstThread.start();
try { firstThread.join();
System.out.println("Довжина черги: " + lenghtOfQueue);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else {
firstThread.start();
long start = System.nanoTime();
while (true) {
long finish = System.nanoTime();
if ((finish - start) / (1000_000_000) == 4) {
firstThread.stop();
stopedProcess = 15000_0000 - firstThread.getIterator();
lenghtOfQueue = 25000_0000 + firstThread.getIterator();
secondThread.start(); try {
secondThread.join();
System.out.println("Довжина черги: " + lenghtOfQueue);
System.out.println("Кількість знищених процесів першого потоку: " + (int) (100 * ((double) stopedProcess / (double) lenghtOfQueue)) + "%");
System.out.println("Кількість перерваних запитів другого потоку: " + interruptedProcess + "%");
break;
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
@SuppressWarnings("deprecation")
private synchronized void startThreadSecond(boolean flag) {
Runner run = new Runner();
if (!flag) {
lenghtOfQueue = 25000_0000;
secondThread.start();
try {
secondThread.join();
System.out.println("Довжина черги: " + lenghtOfQueue);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
else {
secondThread.start();
long start = System.nanoTime();
while (true) {
long finish = System.nanoTime();
if ((finish - start) / (1000_000_000) == 6) {
try {
secondThread.suspend();
interruptedProcess = 25000_0000 - secondThread.getIterator();
lenghtOfQueue = 15000_0000 + secondThread.getIterator();
firstThread.start();
firstThread.join();
secondThread.resume();
System.out.println("Довжина черги: " + lenghtOfQueue);
System.out.println("Кількість перерваних процесів другого потоку: " + (int) (100 * ((double) interruptedProcess / (double) lenghtOfQueue)) + "%");
break;
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
...