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

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

18.09.2017, 20:52. Просмотров 579. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.09.2017, 20:52
Ответы с готовыми решениями:

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

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

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

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

2
2965 / 2507 / 778
Регистрация: 05.07.2013
Сообщений: 12,155
18.09.2017, 21:20 2
в гугле забанили?
http://www.baeldung.com/java-dining-philoshophers
0
0 / 0 / 0
Регистрация: 30.11.2015
Сообщений: 83
19.09.2017, 20:34  [ТС] 3
xoraxax, делая по примеру, не останавливается программа...

Добавлено через 12 минут
xoraxax, как можно реализовать, что едят или думают философы с задержкой или мгновенно?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.09.2017, 20:34

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

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

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

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

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


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

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

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