Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 16.06.2020
Сообщений: 11
1

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

17.01.2021, 19:49. Просмотров 1168. Ответов 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);
 }
}
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.01.2021, 19:49

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

Задача обедающих философов при помощи событий (events)
Здравствуйте. Очень нужна помощь с сабжем. Самостоятельно ничего не вышло - не пойму как это вообще...

И снова 5 обедающих философов
Видел много вариантов решений проблемы обедающих философов, но с такой какую нам задали не могу...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

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