某次操作系统实验存档。

这个哲学家除了吃就是睡。。

哲学家.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

Java 哲学家进餐的更多相关文章

  1. Java哲学家进餐问题|多线程

    Java实验三 多线程 哲学家进餐问题: 5个哲学家共用一张圆桌,分别坐在周围的5张椅子上, 在圆桌上有5个碗和5只筷子(注意是5只筷子,不是5双), 碗和筷子交替排列.他们的生活方式是交替地进行思考 ...

  2. Java哲学家进餐

    某次操作系统实验存档. 这个哲学家除了吃就是睡.. 哲学家.java: package operating.entity.philosophyeating; import operating.meth ...

  3. java笔记--超级类Object多线程的应用+哲学家进餐算法内部类与多线程结合

    关于Object类中的线程方法: Object类是所有Java类的 父类,在该类中定义了三个与线程操作有关的方法,使得所有的Java类在创建之后就支持多线程 这三个方法是:notify(),notif ...

  4. 利用Linux下的pthread_mutex_t类型来实现哲学家进餐问题

    首先说一下什么是哲学家进餐问题,这是操作系统课程中一个经典的同步问题, 问题如下:如上图,有6个哲学家和6根筷子(那个蓝色部分表示哲学家,那个紫色长条部分表示筷子),他们分别被编了0~5的号!如果某个 ...

  5. 第4章 同步控制 Synchronization ---哲学家进餐问题(The Dining Philosophers)

    哲学家进餐问题是这样子的:好几位哲学家围绕着餐桌坐,每一位哲学家要么思考,要么等待,要么就吃饭.为了吃饭,哲学家必须拿起两支筷子(分放于左右两端).不幸的是,筷子的数量和哲学家相等,所以每支筷子必须由 ...

  6. linux c语言 哲学家进餐---信号量PV方法一

    1.实验原理   由Dijkstra提出并解决的哲学家进餐问题(The Dinning Philosophers Problem)是典型的同步问题.该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的 ...

  7. 进程同步——哲学家进餐问题Java实现

    哲学家就餐问题是1965年由Dijkstra提出的一种线程同步的问题. 问题描述:一圆桌前坐着5位哲学家,两个人中间有一只筷子,桌子中央有面条.哲学家思考问题,当饿了的时候拿起左右两只筷子吃饭,必须拿 ...

  8. 课程设计——利用信号量实现哲学家进餐问题(JAVA)

    package cn.Douzi.PhiEat; /** * 表示筷子的类 */ public class Chopstick{ /** * 表示筷子是否可用 */ private volatile ...

  9. Java实现PV操作 | 哲学家进餐问题

    运行结果: Java代码: public class Main { public static void main(String[] args) { Global global=new Global( ...

随机推荐

  1. Centos下mongodb的安装与配置

    安装MongoDB的方法有很多种,可以源代码安装,在Centos也可以用yum源安装的方法. 1.准备工作 运行yum命令查看MongoDB的包信息 yum info mongodb-org (提示没 ...

  2. servlet+jsp+jdbc实现从数据库查询用户信息到页面

    工程创建这里就不在累述了,直接从显示User信息列表开始. 备注:我用的是servlet3的注解功能实现的,所以不需要配置web.xml 这是我的工程目录: 首先我们创建实体类: public cla ...

  3. 杭电ACM题单

    杭电acm题目分类版本1 1002 简单的大数 1003 DP经典问题,最大连续子段和 1004 简单题 1005 找规律(循环点) 1006 感觉有点BT的题,我到现在还没过 1007 经典问题,最 ...

  4. python解释执行原理(转载)

    Python解释执行原理 转自:http://l62s.iteye.com/blog/1481421 这里的解释执行是相对于编译执行而言的.我们都知道,使用C/C++之类的编译性语言编写的程序,是需要 ...

  5. python_day05(去爬登录的豆瓣)

    # 爬豆瓣需要用cookie# 需要注意隐藏的参数,即input 里面的默认的一些参数# 需要自己注册一个账户密码import urllib.requestimport http.cookiejarf ...

  6. [Docker网络]模拟一台交换机的拓扑

    [Docker网络]模拟一台交换机的拓扑 本例主要对Docker网络进行实际运用. 背景介绍 一台虚拟机如何模拟成一台多端口交换机分别连接多台虚拟机? bridge网桥技术 实验准备 docker d ...

  7. TCP/IP 协议栈 ------ ICMP

    I C M P经常被认为是 I P层的一个组成部分.它传递差错报文以及其他需要注意的信息.I C M P报文通常被I P层或更高层协议( T C P或U D P)使用.一些I C M P报文把差错报文 ...

  8. 译|调整JavaScript抽象的迭代方案

    原文作者:Kaloyan Kosev 原文链接:https://css-tricks.com/adapting-javascript-abstractions-time/ 翻译译者:小溪里 校对:华翔 ...

  9. Process Doppelgänging

    Process Doppelgänging -- 新的代码注入技术,通杀windows系统的所有版本,并且能绕过绝大多数的安全软件. 介绍 今天(2017-12-07),在伦敦举行的2017年黑帽欧洲 ...

  10. 使用tail命令实时查看日志文件

    [Shell] 纯文本查看 复制代码 ? 1 tail -f /日志文件 好了.就这样用.简单吧    退出ctrl+C