Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Другие темы раздела
Java простая утилита ком. строки на базе jcifs https://www.cyberforum.ru/ java/ thread2766052.html
здравствуйте. есть выкачанный с оффсайта jcifs-1.3.19.jar надо на его базе создать утилиту, принимающую на вход url типа smb://server/sharename/filename (стандартный формат пути, поумолчанию...
Парсинг Java Java
День добрый, начал изучать Java пару дней назад, попробовать сделать погодного бота для Телеграм, появилась проблема с тем, чтобы парсить JSON строку, приходящую со стороннего сайта(не совсем...
Java Различия TreeMap в java 7 и java 8
Знающие люди, подскажите пожалуйста различия TreeMap'a в java 7 и java 8. Буду премного благодарен!
Java инициализация массива Помогите пожалуйста код на java Провести инициализацию массива такого вида {0, 10, 20, 30, 40, 50, 60, 70, 80, 90} и вывести на экран следующую запись: >> 0 >> 0 10 >> 0 10 20 >> 0 10 20... https://www.cyberforum.ru/ java/ thread2754483.html
Java Как задать путь к браузеру в selenium webdriver https://www.cyberforum.ru/ java/ thread2747150.html
У меня такой вопрос. Я пишу программу на java, где использую selenium webdriver который запускает тесты в Chrome браузере. Но браузер постоянно обновляется и программа выдает ошибку, приходится...
Java Разработка программы очистки реестра
Программа должна предусматривать вывод предупреждающих сообщений, а также запросы на подтверждение удаляемых данных и возможность запрета очистки несанкционированным пользователям Очень нужно...
Java Списки в обьектах
Мне нужно создать обьект Teacher, при создании которого с клавиатуры будет записываться имя преподавателя, а также будет автоматически создаваться список Students, в котором будут записаны студенты...
Java Jaspersoft Studio + Docker :p Друзья сделал связку Jaspersoft Studio + Docker. Запуск контейнера. docker run -it --privileged --env DISPLAY=unix$DISPLAY -v $XAUTH:/root/.Xauthority -v /tmp/.X11-unix:/tmp/.X11-unix -v... https://www.cyberforum.ru/ java/ thread2740477.html
Java Реализовать заполнение дерева в джаве https://www.cyberforum.ru/ java/ thread2739236.html
Добрый день, есть файл вида: G RR A C L F LLR X LLL F R X RL H LL Где 1 элемент в строке - это элемент дерева, а R и L это путь к нему от корня. Строка в которой нет L и R - корень(в нашем...
Java Функции и переменные данного кода, алгоритм Дийкстры Здравствуйте! Помогите разобратьсч дл чего нужны некоторые переменные и как работают определенные функции. Думаю длч многих этот код, реализующий алгоритм Дийкстры знаком. Как работает функцич... https://www.cyberforum.ru/ java/ thread2736641.html
Java Составить программу для управления скоростью движения точки по апплету https://www.cyberforum.ru/ java/ thread2733719.html
Составить программу для управления скоростью движения точки по апплету. Одна кнопка увеличивает скорость, другая – уменьшает. Каждый щелчок изменяет скорость на определенную величину. Прочитал...
Java Сохранения файла в jar Я разрабатываю свою игру на java, танчики. И вот карта в игре представлена в виде текстового файла Я решил сделать редактор карт и под самый конец у меня появился вопрос, как сохранять получившиеся... https://www.cyberforum.ru/ java/ thread2732982.html
0 / 0 / 0
Регистрация: 16.06.2020
Сообщений: 11
0

Задача обедающих философов Java

17.01.2021, 19:49. Просмотров 1555. Ответов 0
Метки (Все метки)


При реализации обедающих философов на джаве возникла такая проблема, у меня есть философов и я не понимаю как сделать так, чтоб они брали вилки вместе и не вылезали при этом ошибки, на данном этапе код работает правильно, но они берут всё такие вилки по очереди, будто задача consumer и producer, но мне нужно именно, динамическое выполнение данного действия, тоесть чтоб свободные вилки могли брать одновременно, а не по очереди, думаю тут проблема в lock-ере, но если я убираю, то они одновременно возьмут пару свободных вилок и я так понимаю происходит deadlock, поэтому для меня главная цель чтоб они одновременно все брали свободные вилки, а если она занята, то ждали...Помогите пожалуйста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
 
public class Six {
    public static void main(String[] args){
        var philosopher = new ArrayList<Thread>();
        Eating eating = new Eating();
        eating.addFork();
        philosopher.add(new Thread(new Philosopher(1,2,eating)));
        philosopher.add(new Thread(new Philosopher(2,3,eating)));
        philosopher.add(new Thread(new Philosopher(3,4,eating)));
        philosopher.add(new Thread(new Philosopher(4,5,eating)));
        philosopher.add(new Thread(new Philosopher(5,6,eating)));
        philosopher.add(new Thread(new Philosopher(6,7,eating)));
        philosopher.add(new Thread(new Philosopher(7,1,eating)));
 
        philosopher.forEach(Thread::start);
    }
}
class Eating{
 
    private final HashMap<Integer,Integer> fork = new HashMap<>(); //0 - её нет в наличии , 1 - есть в наличии
    ReentrantLock locker;
    Condition condition;
 
    Eating(){
        locker = new ReentrantLock();
        condition = locker.newCondition();
    }
 
    void addFork() {
        fork.put(1, 1);
        fork.put(2, 1);
        fork.put(3, 1);
        fork.put(4, 1);
        fork.put(5, 1);
        fork.put(6, 1);
        fork.put(7, 1);
    }
    void getFork(int left,int right){
 
    locker.lock();
        try {
 
            while (true) {
                if (fork.get(left) == 1 && fork.get(right) == 1) {
                    fork.put(left, 0);
                    fork.put(right, 0);
                    System.out.println("Philosopher give " + left + " and " + right + " forks || Status table: "+fork);
                    Thread.sleep(4000);
                    fork.put(left, 1);
                    fork.put(right, 1);
                    System.out.println("Philosopher was eating         || Status table: "+fork);
                    condition.signalAll();
 
                }
 
                condition.await();
            }
        }
        catch (InterruptedException e){
            System.out.println("Error");
        }
        finally {
            locker.unlock();
        }
 
 
    }
}
 
class Philosopher implements Runnable{
    Eating eating;
    int right,left;
    public Philosopher(int left,int right,Eating eating){
        this.left=left;
        this.right=right;
        this.eating=eating;
    }
 @Override
 public void run(){
     try {
         Thread.sleep(300);
     } catch (InterruptedException e) {
         e.printStackTrace();
     }
     eating.getFork(left,right);
 }
}


Вернуться к обсуждению:
Задача обедающих философов Java
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.01.2021, 19:49
Готовые ответы и решения:

Как можно упростить код для обедающих философов и добавить описание действия для каждого философа?
import java.util.Random; import java.util.concurrent.Semaphore; import...

Задача об обедающих философах
Доброго времени суток! Поиском пользовался, но ответа для себя не нашёл, поэтому создаю тему. ...

Задача обедающих философов
Здраствуйте. Нужно написать программу, которая реализует классическую задачу обедающих философов с...

задача про обедающих философов
Здравствуйте! Делаю программу про обедающих философов. ...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.