Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 30.11.2015
Сообщений: 83

Как можно упростить код для обедающих философов и добавить описание действия для каждого философа?

18.09.2017, 20:52. Показов 1544. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.atomic.AtomicInteger;
 
public class Philosopher implements Runnable {
 
    private final Semaphore waiter; // слуга
    private final AtomicInteger eaten; // съедено
    private final long eatTime; // время есть
    private final long thinkTime; // время думать
    private final Fork fork1, fork2; // вилки
    private int count;
    Random rnd = new Random();
 
    public Philosopher(Semaphore waiter, AtomicInteger eaten, long eatTime, long thinkTime, Fork fork1, Fork fork2) {
        this.waiter = waiter;
        this.eaten = eaten;
        this.eatTime = eatTime;
        this.thinkTime = thinkTime;
        this.fork1 = fork1;
        this.fork2 = fork2;
    }
 
    private void take(Fork fork) {
        fork.onTake();
    }
 
    private void put(Fork fork) {
        fork.onPut();
    }
 
    private void eat() {
        count++;
        Util.waitMillis(eatTime);
    }
 
    private void think() {
        Util.waitMillis(thinkTime);
    }
 
    @Override
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            try {
                waiter.acquire();
 
                take(fork1);
                take(fork2);
                eat();
                put(fork1);
                put(fork2);
 
                think();
            } catch (InterruptedException e) {
                // do nothing
            } finally {
                waiter.release();
                think();
            }
        }
        eaten.set(count);
    }
}
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
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicInteger;
 
public class Util {
 
    public static void printResult(String s, AtomicInteger[] a){
        int sum = 0;
        int[] answer = new int[a.length];
        for (int i = 0; i < answer.length; i++) {
            answer[i] = a[i].get();
            sum += answer[i];
        }
        String[] percentage = new String[answer.length];
        for (int i = 0; i < answer.length; i++) {
            double percents =  10000.0 * answer[i] / sum;
            long round = Math.round(percents);
            percentage[i] = "" + round / 100 + "."
                    + (round % 100 < 10 ? "0" : "") + round % 100 + "%";
        }
 
        System.out.println(s + " " + sum + ": " + Arrays.toString(answer));
        System.out.println("Percentage: " + Arrays.toString(percentage));
        System.out.println();
        waitMillis(1000);
    }
 
    public static void printResult(AtomicInteger[] a){
        printResult("Eaten", a);
    }
 
    public static void waitMillis(long millis) {
        if (millis <= 0) {
            return;
        }
        try {
            Thread.sleep(millis);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
 
public class Fork {
 
    private final Lock lock = new ReentrantLock();
 
    public void onTake() {
        lock.lock();
    }
 
    public void onPut() {
        lock.unlock();
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Main {
    public static int N = 5;
 
    public static void main(String[] args) throws InterruptedException {
        run(0, 0);
        run(0, 1);
        run(1, 0);
        run(1, 1);
    }
 
    private static void run(long eatTime, long thinkTime) {
        System.out.println("eat= " + eatTime + "ms, think = " + thinkTime + "ms");
        new Waiter(N, eatTime, thinkTime).newRun();
    }
}
Добавлено через 57 минут
подскажите пожалуйста, очень нужно
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.09.2017, 20:52
Ответы с готовыми решениями:

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

задача про обедающих философов
Здравствуйте! Делаю программу про обедающих философов. http://alice.pnzgu.ru/~dvn/prolog/articls/9.htm Хочу сделать через картинки....

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

2
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
18.09.2017, 21:20
в гугле забанили?
http://www.baeldung.com/java-dining-philoshophers
0
0 / 0 / 0
Регистрация: 30.11.2015
Сообщений: 83
19.09.2017, 20:34  [ТС]
xoraxax, делая по примеру, не останавливается программа...

Добавлено через 12 минут
xoraxax, как можно реализовать, что едят или думают философы с задержкой или мгновенно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.09.2017, 20:34
Помогаю со студенческими работами здесь

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

Можно ли упростить код верстки для письма?
HTML код для письма имеет вид: &lt;div style=&quot;background-color: #FC9; padding:2%;&quot;&gt; &lt;p style=&quot;font-family:Arial; font-size:12px;...

Как упростить однотипный код для нескольких Button
Имеется несколько Button'ов, при клике они меняют цвет как можно проще прописать такую функцию? чтобы каждый раз вот такую туфту не...

TabControl. Можно ли разделить код, чтобы для каждого tabPage был отдельный файл с кодом?
При большом количестве tabPage может оказаться огромный код. Можно ли сделать Файл 1 для tabPage1 using System; using...

как можно упростить код?
как можно упростить код? есть несколко label по ним двигается слово по 1 букве на label и при смене буквы меняется Random цвет(color) ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru