某次操作系统实验存档。

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

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

    某次操作系统实验存档.V 这个哲学家除了吃就知道睡.( ╯□╰ ) 哲学家.java: package operating.entity.philosophyeating; import operat ...

  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. kafka "HelloWorld"实践

    前面我们分别介绍了kafka的相关基本原理,kafka的集群服务器搭建以及kafka相关的配置,本文综合前面的理论知识,运用kafka Java API实现一个简单的客户端Demo. 开发环境 操作系 ...

  2. 160614、Eclipse下JRebel6.2.0热部署插件安装、破解及配置

    标签: 这两天在做后台管理系统,前端框架用Bootstrap,后端用SpringMVC+Velocity.在开发过程中,经常需要对界面进行微调,调整传参等,每次更改一次java代码,就得重新部署一次, ...

  3. 面试之二:Redis是单线程还是多线程?以及处理模型。

      Redis是单线程还是多线程?以及处理模型. 线程:单线程 处理模型:参考书<Redis 设计与实现>P151-152 ![](https://ws1.sinaimg.cn/large ...

  4. Android Handler 的使用

    Android UI 操作是线程不安全的.我们只能在UI线程或者说主线程中修改UI.试想多个Thread操作同一个UI,可能引起不一致.UI 线程的主要工作是:UI界面更新显示,各个控件的交互等等.一 ...

  5. c#自定义控件做漂亮的列表

    效果图如下: 完整项目代码下载: 点击下载

  6. [已解决]ubuntu下chrome和firefox输入框内无法快捷键全选

    问题现象: 在chrome或firefox浏览器(其他地方没试)的输入框中使用ctr + a进行全选失效,在google中找到了这个已经解决的http://askubuntu.com/question ...

  7. Spark Streaming源码分析 – JobScheduler

    先给出一个job从被generate到被执行的整个过程在JobGenerator中,需要定时的发起GenerateJobs事件,而每个job其实就是针对DStream中的一个RDD,发起一个Spark ...

  8. ICO成本价

    [当前ICO成本价]仅供参考:ICOcoin 成本价1元SNT 成本价0.26元UGT 成本价2.7元PAY 成本价6元OMG 成本价2.6元YOYO 成本价 0.17元BNT 成本价26元BAT 成 ...

  9. Python并行编程(二):基于线程的并行

    1.介绍 软件应用中使用最广泛的并行编程范例是多线程.通常一个应用有一个进程,分成多个独立的线程,并行运行.互相配合,执行不同类型的任务. 线程是独立的处理流程,可以和系统的其他线程并行或并发地执行. ...

  10. Python并行编程(一):基本概念

    1.线程和进程 进程是应用程序的一个执行实例,比如,在桌面上双击浏览器将会运行一个浏览器.线程是一个控制流程,可以在进程内与其他活跃的线程同时执行.控制流程指的是顺序执行一些机器指令.进程可以包含多个 ...