
Лаб работа языки высокого уровня java (5)
.docxФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
БЕЛГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ НАЦИОНАЛЬНЫЙ
ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ
(НИУ «БелГУ»)
ИНСТИТУТ ИНЖЕНЕРНЫХ И ЦИФРОВЫХ ТЕХНОЛОГИЙ
КАФЕДРА ПРИКЛАДНОЙ ИНФОРМАТИКИ И ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ
Отчет по лабораторной работе № 5
Вариант 7
Тема работы “Программирование на языке Java”
по дисциплине “Программирование на языках высокого уровня”
студента очного отделения
3 курса 12002105 группы
Проверил:
Ст. преп. Лифиренко Максим Вячеславович
Белгород, 2024
Задание
Эмулировать работу следующего процесса «Винни-Пух и пчелы». Заданное количество пчел добывают мед равными порциями, задерживаясь в пути на случайное время. Винни-Пух потребляет мед порциями заданной величины за заданное время и столько же времени может прожить без питания. Работа каждой пчелы реализуется в порожденном процессе (потоке).
Ход выполнения работы
В ходе выполнения работы была успешно проведена работа по изучению принципов разработки многопоточных приложений на языке программирования Java. Было успешно выполнено задание лабораторной работы.
Согласно заданию, программа запускает несколько потоков пчёл, поток, содержащий медведя, и поток, который выводит данные в консоль. Все они используют объект класса BearResources, в котором хранится текущий запас мёда.
Вывод данных о текущем количестве мёда построен на использовании паттерна observer. Каждый раз, когда в объекте класса ресурсов меняется количество мёда, он оповещает своего наблюдателя, работающего в отдельном потоке, и тот выводит в консоль текущее количество мёда.
Результат выполнения работы представлен на рисунке 1.
Рисунок 1 – Результат выполнения лабораторной работы
Таким образом, задание лабораторной работы было выполнено успешно.
Листинг программы
package com.hll;
public class Main {
public static void main(String[] args) throws InterruptedException {
BearResources bearResources = new BearResources();
int countOfBees = 3;
float beeProductivity = 0.5f;
int beeMinTime = 2000;
int beeMaxTime = 5000;
float bearAppetite = 3;
long bearEatInterval = 1000;
long bearTimeToDeath = 3000;
try {
Bear bear = new Bear(bearAppetite,
bearTimeToDeath,
bearEatInterval,
bearResources);
bear.start();
// bear.join();
BearResourcesLogger bearResourcesLogger = new BearResourcesLogger(bearResources);
bearResources.setObserver(bearResourcesLogger);
bearResourcesLogger.start();
for (int i = 0; i < countOfBees; i++) {
Bee bee = new Bee(beeProductivity,
beeMinTime,
beeMaxTime,
bearResources,
i + 1);
bee.start();
// bee.join();
System.out.println("Пчела " + (i + 1) + " создана");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class BearResources {
// Start honey supply for bear to not die right after start
private double honeySupply = 10;
private Observer observer;
public void setObserver(Observer observer) {
this.observer = observer;
}
private void notifyObserver() {
if (observer != null) {
observer.update(honeySupply);
}
}
public synchronized void addHoney(double amount) {
honeySupply += amount;
notifyObserver();
// if (honeySupply > 3000){
// System.exit(0);
// }
}
public synchronized void eatHoney(double amount) {
honeySupply -= amount;
notifyObserver();
}
public double getHoneySupply() {
return honeySupply;
}
}
class Bee extends Thread {
double beeProductivity;
double beeMinTime;
double beeMaxTime;
BearResources bearResources;
int beeNumber;
public Bee(double beeProductivity,
double beeMinTime,
double beeMaxTime,
BearResources bearResources,
int beeNumber) {
this.bearResources = bearResources;
this.beeProductivity = beeProductivity;
this.beeMinTime = beeMinTime;
this.beeMaxTime = beeMaxTime;
this.beeNumber = beeNumber;
}
@Override
public void run() {
// Sleep time between min and max interval, then add honey to bearResources
try {
while (true) {
Thread.sleep((long) (Math.random() * (beeMaxTime - beeMinTime) + beeMinTime));
System.out.printf("Пчела %d принесла %.2f мёда.\n", beeNumber, beeProductivity);
bearResources.addHoney(beeProductivity);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Bear extends Thread {
float bearAppetite;
long bearTimeToDeath;
long bearEatInterval;
BearResources bearResources;
boolean isBearHungry;
long bearLastEatTime = 0;
double countOfFeedSkips = 0;
public Bear(float bearAppetite,
long bearTimeToDeath,
long bearEatInterval,
BearResources bearResources) {
this.bearResources = bearResources;
this.bearAppetite = bearAppetite;
this.bearTimeToDeath = bearTimeToDeath;
this.bearEatInterval = bearEatInterval;
}
@Override
public void run() {
// Sleep, then check if there is enough honey in resources
// If there is - eat honey and update last eat time
// If not - sleep again and check again
// Check if current time - bearTimetoDeath > bearLastEatTime
// If true - die and stop whole program
try {
while (true) {
Thread.sleep(bearEatInterval);
if (bearResources.getHoneySupply() > bearAppetite) {
System.out.printf("Медведь съел %.2f мёда.\n", bearAppetite);
bearResources.eatHoney(bearAppetite);
bearLastEatTime = System.currentTimeMillis();
isBearHungry = false;
countOfFeedSkips -= 1;
} else {
isBearHungry = true;
countOfFeedSkips ++;
// Check if bear died from hungry
if (System.currentTimeMillis() - bearLastEatTime > bearTimeToDeath) {
System.out.println("\n|||||||||||||\n|| Медведь умер от голода. Надо больше мёда.\n|||||||||||||\n");
System.exit(0);
}
if (countOfFeedSkips < 3){
System.out.printf("Мишка%s не поел. Аккуратнее :(\n", countOfFeedSkips > 0 ? " опять" : "");
}
else{
System.out.println("Мишка живёт впроголодь. Надо что-то решать");
}
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
interface Observer {
void update(double honeySupply);
}
class BearResourcesLogger extends Thread implements Observer {
private BearResources bearResources;
boolean observableHasUpdates = true;
public BearResourcesLogger(BearResources bearResources) {
this.bearResources = bearResources;
}
@Override
public void run() {
// while (true) {
// if (observableHasUpdates) {
// System.out.printf("Остаток мёда: %.2f\n", bearResources.getHoneySupply());
// observableHasUpdates = false;
// }
// try {
// Thread.sleep(10);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// }
}
@Override
public void update(double honeySupply) {
// observableHasUpdates = true;
System.out.printf("Остаток мёда: %.2f\n", honeySupply);
}
}
// class BearResourcesLogger extends Thread {
// public BearResources bearResources;
// long sleepInterval = 1000;
// public BearResourcesLogger(BearResources bearResources, long sleepInterval) {
// this.sleepInterval = sleepInterval;
// this.bearResources = bearResources;
// }
// @Override
// public void run() {
// try {
// while (true) {
// System.out.printf("Остаток мёда: %.2f\n", bearResources.getHoneySupply());
// Thread.sleep(sleepInterval);
// }
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// }
// }