Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2019, 10:14   #1
gdfgdiib
Новичок
Джуниор
 
Регистрация: 22.04.2019
Сообщений: 1
По умолчанию Задача по многопоточности

Задача:

Необходимо реализовать многопоточное приложение, которое решает следующую задачу:
Есть два типа пользователя (два типа потока). Один - Хозяин, имеет в своем арсенале список вещей (Вещь: цена и вес), второй - Вор, имеет рюкзак (Рюкзак: предельный вес, который может в себя вместить). Поток Хозяина выполняет работу по выкладыванию вещей в квартиру. Поток Вора - забирает вещи из квартиры. При этом Вор должен забрать такие вещи, чтобы их ценность была максимальной и вес их должен быть меньше предельного веса, который может поместиться в рюкзак.

Объектные модели:
1. Вещь; атрибуты: вес, ценность
2. Хозяин; атрибуты: Вещи; действия: внести вещи в квартиру
3. Рюкзак; атрибуты: предельный вес
3. Вор; атрибуты: рюкзак. Действия: сложить вещи в рюкзак.

Ограничения:
1. Если работает поток Хозяина, то вор не должен класть вещи в рюкзак.
2. Если работает Вор, то Хозяин не может войти в квартиру

Возможные ограничения системы:
1. Хозяев может быть 1..n.
2. потоки Хозяев БЕЗ взаимной блокировки: несколько хозяев могут выкладывать вещи в квартиру одновременно
3. Воров может быть 1..m.
4. Потоки Воров со ВЗАИМНОЙ блокировкой: воровать одновременно может только 1 вор."

я делал следующим образом


Код:
public class Apartment {
    private LinkedList<Thing> thingsInApartment = new LinkedList<>();
    private int thingCounter = 0;
    Random random = new Random();
 
 
    public LinkedList<Thing> getThingsInApartment() {
        return thingsInApartment;
    }
    public synchronized void get(Thing thing) {
            while (thingCounter < 1) {
                try {
                  wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            thingsInApartment.remove(thing);
            thingCounter--;
            notifyAll();
        }
 
    public synchronized void put(Thing thing) {
        while (thingCounter>=random.nextInt(20)+1 ) {
            try {
                wait();
            }
            catch (InterruptedException e) {
                e.printStackTrace();
           }
        }
        thingCounter++;
        thingsInApartment.add(thing);
        notifyAll();
    }
 
}

Т.е. у меня есть апартаменты, 2 синхронизированных метода, один складывает вещи, другой забирает, соответственно, 2 класса Вор и Хозяин, наследуемые от Runnable. Хозяин добавляет, вор забирает



Код:
public class Owner implements Runnable {
 
    Thing thing;
    Apartment apartment;
 
 
    public Owner(Apartment apartment, Thing thing) {
        this.apartment = apartment;
        this.thing = thing;
    }
 
 
 
    @Override
    public void run() {
        for (int i = 0; i <= 15; i++) {
            apartment.put(new Thing());
            System.out.println("Хозяин принес вещь ценой "
                    + apartment.getThingsInApartment().get(i).getPrice()
                    + " руб. и весом "
                    + apartment.getThingsInApartment().get(i).getWeight() + " кг");
        }
 
    }
}

Код:
public class Thief implements Runnable {
    private Apartment apartment;
    private BackPack backPack;
    private Thing thing;
    Random random = new Random();
 
    public Thief(Apartment apartment, Thing thing) {
        this.apartment = apartment;
        this.thing = thing;
        backPack = new BackPack(apartment.getThingsInApartment());
    }
 
 
    @Override
    public void run() {
        backPack.maxWeight = random.nextInt(20)+5;
        int maxWeight = backPack.maxWeight;
 
        int thingWeight;
        for (int i = 0; i <= 15; i++) {
            thingWeight = apartment.getThingsInApartment().get(i).getWeight();
            System.out.println("Рюкзак вора вмещает " + maxWeight + " кг");
            if (thingWeight > maxWeight) {
              apartment.put(new Thing());
                        System.out.println("Вор не смог утащить вещь весом "
                                + thingWeight + " кг, убрал вещь "
                                + "на место и ждет нового"
                                +  " поступления");
            }
            else if(thingWeight < maxWeight || maxWeight > 0) {
                    apartment.get(new Thing());
                    System.out.println("Вор забрал вещь ценой "
                            + apartment.getThingsInApartment().get(i).getPrice()
                            + " руб. и весом "
                            + apartment.getThingsInApartment().get(i).getWeight() + " кг");
                    maxWeight -= thingWeight;
                    System.out.println("Остаток места в рюкзаке " + maxWeight + " кг");
            }
        }
 
 
 
    }
}
Ну еще классы Вещь и Рюкзак, но они ничего в себе не несут. В правильном направлении я размышляю? Что значит воров надо сделать с взаимной блокировкой? Как сделать чтобы только один вор был? И как сделать так чтобы он брал максимально дорогую вещь, если она вмещается к нему в рюкзак
gdfgdiib вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книги по многопоточности в Java _Osaka Общие вопросы по Java, Java SE, Kotlin 1 13.02.2017 19:52
Реализация многопоточности в FTP Asain-Asa Общие вопросы по программированию, компьютерный форум 0 23.09.2012 10:25
проблема многопоточности C++ waplus Помощь студентам 0 25.05.2011 03:36
проблема с реализацией многопоточности в c# whitebrain Помощь студентам 0 19.03.2010 01:23