Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб работа языки высокого уровня java (5)

.docx
Скачиваний:
2
Добавлен:
25.05.2024
Размер:
53.4 Кб
Скачать

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

БЕЛГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ НАЦИОНАЛЬНЫЙ

ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ

(НИУ «БелГУ»)

ИНСТИТУТ ИНЖЕНЕРНЫХ И ЦИФРОВЫХ ТЕХНОЛОГИЙ

КАФЕДРА ПРИКЛАДНОЙ ИНФОРМАТИКИ И ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ

Отчет по лабораторной работе № 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();

// }

// }

// }