Java哲学家进餐

某次操作系统实验存档。

哲学家.java:

package operating.entity.philosophyeating;

import operating.method.Semaphore;

import java.util.Date;

public class Philosophy implements Runnable {
    /**
     * 统计哲学家数量
     */
    private static int total = 0;
    /**
     * 哲学家的 id
     */
    private int id;
    private Semaphore leftChopsticks;
    private Semaphore rightChopsticks;
    /**
     * 记住睡眠时间
     */
    private Long sleepTime;

    public Philosophy(Semaphore leftChopsticks, Semaphore rightChopsticks) {
        id = total++;
        sleepTime = new Date().getTime();
        this.leftChopsticks = leftChopsticks;
        this.rightChopsticks = rightChopsticks;
    }

    @Override
    public void run() {
        while(true) {
            if(id % 2 == 0) {
                leftChopsticks.p();
                rightChopsticks.p();

                System.out.println("number " + id + " philosophy is eating, yummy..." + "睡眠 " + endSleep() + "秒。");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                beginSleep();

                rightChopsticks.v();
                leftChopsticks.v();
            } else {
                rightChopsticks.p();
                leftChopsticks.p();

                System.out.println("number " + id + " philosophy is eating, yummy..." + "睡眠 " + endSleep() + "秒。");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                beginSleep();

                leftChopsticks.v();
                rightChopsticks.v();
            }
        }
    }

    /**
     * 开始睡眠
     */
    public void beginSleep() {
        sleepTime = new Date().getTime();
    }

    /**
     * 结束睡眠,返回睡眠时间,单位是秒。
     * @return
     */
    public Long endSleep() {
        return (new Date().getTime() - sleepTime)/1000;
    }
}

测试.java:

package operating.test;

import operating.entity.philosophyeating.Philosophy;
import operating.method.Semaphore;

public class PhilosophyTest {
    public static void main(String[] args) {
        // 创建六支筷子
        Semaphore[] chopsticks = new Semaphore[6];
        for (int i = 0; i != 6; ++i) {
            chopsticks[i] = new Semaphore(1);
        }

        // 创建六个哲学家
        for (int i = 0; i != 6; ++i) {
            if (i == 5) {
                new Thread(new Philosophy(chopsticks[i], chopsticks[0])).start();
            } else {
                new Thread(new Philosophy(chopsticks[i], chopsticks[i+1])).start();
            }
        }
    }
}

/

Semaphore.java

posted @ 2017-11-24 15:17  xkfx  阅读(787)  评论(0编辑  收藏  举报