Java实现哲学家进餐问题

Java基础学习之并发篇:哲学家就餐问题 学习目标 提示:这里可以添加学习目标 例如:一周掌握 Java 入门知识 阅读详情

哲学家问题是操作系统中的重要问题,我在这里谈谈对哲学家进餐的理解,同时附上源代码。

哲学家进餐是对多线程的使用,这里有五位哲学家,同时只有五双筷子,如果一个哲学家想要吃饭,必须同时拿起身边的两只筷子。

这样如果没有处理好就会出现死锁,于是我在这里要求第一位哲学家最先使用左边筷子,其他哲学家最先使用右边筷子,这是防止死锁的一种方法。

我把拿筷子和放筷子都作为函数封装起来,在线程调用的时候就直接按照“先拿左边筷子,再拿右边筷子,释放左边,在释放右边的筷子”的步骤进行,知道每个人都吃到饭再结束。

package second;


public class Exe {


/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
for (int i = 0; i < 5; i++) {
new Thread( new Philosopher(i)).start();
}
}


}
class Philosopher implements Runnable {
static int[] chopsticks = { 1, 1, 1, 1, 1};
int tem;
public Philosopher(int i){
this.tem=i;
}
public void run(){
getChopsticks();
}
public void getChopsticks(){
if (tem==0){//如果是第一个哲学家,先用左边的筷子
if(getLeft(tem)){
if(getRight(tem)){
eating();
freeLeft(tem);
freeRight(tem);
}else{
freeLeft(tem);
}
}else{
System.out.println(tem+"无法获得左手边的筷子");
}
}else{
if(getRight(tem)){
if(getLeft(tem)){
eating();
freeRight(tem);
freeLeft(tem);
}else{
freeRight(tem);
}
}else{
System.out.println(tem+"无法获得右手边的筷子");
}
}


}
public void eating(){
System.out.println(tem + "开始吃饭");
}
public boolean getLeft(int tem){
if(chopsticks[tem]==1){
chopsticks[tem]=0;
System.out.println(tem+"获得左手边的筷子");
return true;
}else{
System.out.println(tem+"不能获得左手边的筷子");
return false;
}

}
public boolean getRight(int tem){
int i= (tem+1)%5;
if(chopsticks[i]==1){
chopsticks[i]=0;
System.out.println(tem+"获得右手边的筷子");
return true;
}else{
System.out.println(tem+"不能获得右手边的筷子");
return false;
}
}
public void freeLeft(int tem){
chopsticks[tem] = 1;
System.out.println(tem+"左手边筷子已释放!");


}
public void freeRight(int tem){
int i = (tem + 1) % 5;
chopsticks[i] = 1;
System.out.println(tem+"右手边筷子已释放!");
}
}


课程设计——利用信号量实现哲学家进餐问题(JAVA) 课程设计——利用信号量实现哲学家进餐问题(JAVA) package cn.Douzi.PhiEat; /** * 表示筷子的类 */ public class Chopstick{ /** * 表示筷子是否可用 */ private volatile boolean av... 阅读详情

相关推荐

JAVA实现哲学家就餐问题

用JAVA实现哲学家就餐问题,本源码中采用的是奇数号哲学家先拿左手后拿右手,而偶数号哲学家采用先拿右手后拿左手的策略来预防死锁。

哲学家就餐问题(java全代码)

java实现哲学家就餐问题

weixin_60401853的博客 1297

哲学家就餐问题JAVA解决算法

用Java实现的哲学家就餐问题,多线程,是操作系统的作业,很不错

哲学家就餐问题(死锁)

本文主要讲述死锁的一个经典案例—哲学家就餐问题,并对该问题进行修复。

Qynwang的博客 1127

模拟哲学家进餐问题(JAVA)

桂林理工大学操作系统实习,关于死锁的哲学家进餐问题,演示系统 , java写的,多线程,有图形界面。 桂林理工大学的就来吧,哈哈 ,附带实验报告

哲学家就餐问题JAVA代码

简单易懂 主要应用闲成方面的知识 class Philosopher extends Thread   {   public Philosopher( DiningPhils HOST , int i )   {     host = HOST;     index = i;   }   public void setTimeSlice( int TS )   {     ts = TS;   }   public void setLeftChopstick( boolean flag )   {     host.setChopstick(index, flag);   }……

哲学家就餐问题之java解决

文章目录前言如何解决这个问题呢1.线程粗化2.奇偶互反3.最少保证 前言 哲学家就餐问题是在计算机科学中的一个经典问题,用来演示在并行计算中多线程同步(Synchronization)时产生的问题。 有五个哲学家,他们共用一张圆桌,分别坐在五张椅子上。在圆桌上有五个碗和五支筷子,平时一个哲学家进行思考,饥饿时便试图取用其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐。进餐完毕,放下筷子又继续思考。 代码描述: public class PhilosopherThread extends Thread

大道坦荡的博客 6596

从零开始使用matlab实现EKF-SLAM算法(含完整代码)

扩展卡尔曼滤波器同步定位与建图 (EKF-SLAM) 算法建立在 EKF 的基础上,集成了 EKF 的功能,可解决机器人技术中最具挑战性的问题之一:同时定位与建图 (SLAM)。 EKF-SLAM采用EKF方法来同时估计机器人的状态和周围环境的布局,而无需事先了解位置。 这种双重功能对于在未知环境中运行的自主系统至关重要,使它们能够在绘制区域地图时有效导航。 EKF-SLAM 算法一直是自动驾驶车辆和机器人系统开发的基石,为处理现实世界环境中固有的不确定性提供了一个强大的框架。

mjmmm的博客 6634

Java实现哲学家进餐问题(防死锁)

这篇博客与其他妖艳的骚货不同,它简单易懂(其实是高难度的不会),但是直指问题的本质。(另外和我一样是操作实习的同学不要抄我作业哦)问题描述:由Dijkstra提出并解决的哲学家进餐问题(The Dinning Philosophers Problem)是典型的同步问题。该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个...

GAYHANG的博客 2394

安卓手机必备:Auto.js快手极速版自动刷视频避坑指南(含最新3.0脚本)

本文是一份安卓自动化工具Auto.js的全面实践指南,重点解析了如何搭建稳定运行环境、配置关键权限以及管理脚本。针对快手极速版等应用的自动化需求,文章详细介绍了设备选择、Auto.js版本对比、各品牌手机后台保活设置,并强调了脚本安全与调试技巧,帮助用户有效避坑,实现自动化任务的稳定执行。

i7j8k9l的博客 782

VC中基于TWAIN协议控制扫描仪-----初级版

PS:本人是C++小白一枚,在研究此功能时不知走了多少弯路

a1101000099的专栏 8789

哲学家进餐问题(Java代码实现)

5位哲学家围坐在圆桌旁,每人面前有一碗饭,左右各有一根筷子。

iov_a的博客 1169

别再瞎改注册表了!实测Win10/Win11远程桌面60帧的正确姿势(附ToDesk对比)

本文深入解析Windows远程桌面60帧优化的科学方法,揭示常见误区并提供实测有效的解决方案。从版本差异到硬件加速,再到第三方工具对比(如ToDesk),帮助用户避开无效的注册表修改,实现流畅的远程桌面体验。

weixin_33738555的博客 341

Java 哲学家进餐问题_Java实现哲学家进餐问题 | 学步园

哲学家问题是操作系统中的重要问题,我在这里谈谈对哲学家进餐的理解,同时附上源代码。哲学家进餐是对多线程的使用,这里有五位哲学家,同时只有五双筷子,如果一个哲学家想要吃饭,必须同时拿起身边的两只筷子。这样如果没有处理好就会出现死锁,于是我在这里要求第一位哲学家最先使用左边筷子,其他哲学家最先使用右边筷子,这是防止死锁的一种方法。我把拿筷子和放筷子都作为函数封装起来,在线程调用的时候就直接按照“先拿左...

weixin_42107374的博客 448

Android Geckoview实战:5分钟搞定JS与原生交互(附完整Demo代码)

本文详细介绍了在Android应用中使用GeckoView替代系统WebView,构建稳定高效的JavaScript与原生代码交互桥梁的实战方法。通过WebExtension架构,文章提供了从环境配置、扩展开发到Android端集成的完整步骤,并附有可运行的Demo代码,帮助开发者快速解决混合应用中的兼容性问题。

u5v6w7的博客 934

脑机接口(BCI)从原理到开发实战 01|意念控制真的来了?一文看懂脑机接口的技术革命

类型定义典型应用主动式用户主动产生特定思维模式来控制设备运动想象(想象左手/右手移动)反应式用户被动接受外部刺激,系统检测大脑反应P300拼写器、SSVEP(稳态视觉诱发电位)被动式系统监测用户自发脑状态,不要求主动控制疲劳监测、情绪识别、注意力评估本系列后续文章将重点围绕主动式(运动想象)和反应式(P300/SSVEP)展开实战。脑机接口,这个曾经只存在于科幻中的概念,正在政策、资本、技术的三重驱动下,加速从实验室走向产业落地。2026年,注定是脑机接口发展史上浓墨重彩的一年。

小明的博客 1431

哲学家进餐问题解决思路 JAVA实现

package com.test.server.current; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurr...

qq_41810184的博客 868

(代码可运行)半导体器件和工艺模拟 使用Silvaco设计构建NMOS并提取各项工艺及器件参数

win10。

qq_20388971的博客 109

java 多线程实现 哲学家进餐问题

每个哲学家面前都有一碟通心面,由于面条很滑所以要两把叉子才能夹住。相邻两个碟子之间有一把叉子。哲学家两种活动:即吃饭和思考。当一个哲学家觉得饿时他就试图去取他左边和右边的叉子。如果成功地获得两把叉子,他就开始吃饭,吃完以后放下叉子继续思考

tiantangpw的专栏 4107

OmniDrive(2):环境搭建

项目中使用的是全量的数据集(full dataset v1.0), 数据量比较大,训练验证(trainval) + test 总计200多G的数据,单独一个个下载会比较慢。参数,否则安装的时候会自动卸载已安装好的torch,重新安装最新版本的torch,这是不允许的。在cuDNN官网下载,默认下载的是最新版本的cuDNN,我们这里点击。,== 博文中详细介绍了完整的cuda和cudnn的安装过程==分析: 这是因为yapf 安装的版本不对,需要安装特定的版本。出现训练的loss变化,就说明可以正常训练了。

@bangbang的博客 623

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

操作系统中的哲学家进餐问题的实现(java实现)

在学习操作系统这本书的时候,我们使用的是汤小丹老师的《计算机操作系统》接下来我将会使用java语言去实现内部代码。 Swap指令 哲学家就餐问题是在计算机科学中的一个经典问题,用来演示在并行计算中多线程同步(Synchronization)时产生的问题。在1971年,著名的计算机科学家艾兹格·迪科斯彻提出了一个同步问题,即假设有五台计算机都试图访问五份共享的磁带驱动器。稍后,这个问题被托尼·霍...

韦海涛的博客 2006

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

哲学家吃饭问题java版_课程设计——利用信号量实现哲学家进餐问题(JAVA)

packagecn.Douzi.PhiEat;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class DiningPhilosophersFrame extendsJFrame{private final JPanel panel1 = newJPanel();private final JPanel ...

weixin_28848917的博客 345

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

java实现哲学家进餐问题,及其死锁问题的解决

首先我们来了解一下哲学家进餐问题的背景: 话说有5个哲学家围在一张桌子上吃饭,桌上只有5g根筷子,一个要吃饭必须的得有两根筷子,哲学家要吃饭时总是先拿起左边的筷子,在拿起右边的筷子,这样最佳的情况是可同时有两人可以进餐,最坏的情况是大家都拿起了左边的筷子,大家都没得吃。哲学家吃完时会停下来思考一段时间,等饿了在吃。 下面我们来看一下java如何模拟哲学家进餐问题import java.util.

demoyi的博客 1万+

哲学家进餐问题,java实现

废话不多说,代码开始: publicclassScientistextendsThread{/**@author:Bore*@mail:zhaogangtao@gmail.com*@time:2010/12/7*1.哲学家进餐,5个哲学家,5只筷子*2.哲学家通过getChopstic...

weixin_33872566的博客 134

哲学家进餐问题(java模拟死锁及解决方案)

一、问题描述 哲学家进餐问题是由 Dijkstra 提出并解决的,该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐完毕,放下筷子继续思考。如下图所示: 二、代码模拟实现 经分析可知,放在桌子上的筷子是临界资源,在一段时间内只允许一位哲学家使用。为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量构成信

qq_39559641的博客 5720
上一篇: 操作系统之银行家算法的学习Java系列
下一篇: android bitmap学习资料
Richard__su
博客等级 码龄15年 5粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值