哲学家就餐 java_java模拟哲学家就餐问题
废话不多说 直接上代码
1.筷子类 他有两个属性, 一个是标示这根筷子在哪个哲学家手边,另一个属性标示这个筷子的状态,并且这个状态是随时从内存当中取出的
package com.bjs.dinning;
public class Chopstick {
/**
* 表示筷子是否可用
* */
private volatile boolean available = true;
private int id;
public Chopstick() {
}
public Chopstick(int id) {
this.id = id;
}
public int getId() {
return id;
}
public boolean isAvailable() {
return available;
}
public void setAvailable(boolean available) {
this.available = available;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "筷子" + id;
}
}
2.筷子数组 动态决定几个哲学家 几根筷子
package com.bjs.dinning;
public class ChopstickArray {
private Chopstick[] chopsticks;
public ChopstickArray() {
}
public ChopstickArray(int size) {
chopsticks = new Chopstick[size];
for (int i = 0; i
chopsticks[i] = new Chopstick(i);
}
}
public Chopstick getId(int id) {
return chopsticks[id];
}
public Chopstick getLast(int id) {
if (id == 0) {
return chopsticks[chopsticks.length - 1];
} else {
return chopsticks[id - 1];
}
}
}
3.哲学家类
package com.bjs.dinning;
import java.util.Random;
import javax.swing.JTextArea;
public class Philosopher implements Runnable {
ChopstickArray chopstickArray;
JTextArea eatingTextArea;
private int id;
private boolean state;
JTextArea thinkingTextArea;
JTextArea waitingTextArea;
public Philosopher() {
}
public Philosopher(int id, ChopstickArray chopstickArray,
JTextArea thinkingTextArea, JTextArea eatingtextArea,
JTextArea waitingTextArea) {
this.id = id;
this.chopstickArray = chopstickArray;
this.thinkingTextArea = thinkingTextArea;
this.eatingTextArea = eatingtextArea;
this.waitingTextArea = waitingTextArea;
}
public synchronized void eating() {
if (!state) { // 在思考
if (chopstickArray.getId(id).isAvailable()) { // 如果哲学家右手边的筷子可用
if (chopstickArray.getLast(id).isAvailable()) { // 如果左手边的筷子也可用
// 然后将这个能吃饭的哲学家两侧的筷子都设置为不可用
chopstickArray.getId(id).setAvailable(false);
chopstickArray.getLast(id).setAvailable(false);
String text = eatingTextArea.getText();
eatingTextArea.setText(text + this + "在吃饭\n");
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
} else {
// 右手边的筷子可用,但是左手边的不可用
String str = waitingTextArea.getText();
waitingTextArea.setText(str + this + "在等待"
+ chopstickArray.getLast(id) + "\n");
try {
wait(new Random().nextInt(100));
} catch (Exception e) {
e.printStackTrace();
}
}
} else {
// 如果哲学家右手边的筷子不可用则等待
String str = waitingTextArea.getText();
waitingTextArea.setText(str + this + "在等待"
+ chopstickArray.getId(id) + "\n");
try {
wait(new Random().nextInt(100));
} catch (Exception e) {
e.printStackTrace();
}
}
}
state = true;
}
@Override
public void run() {
for (int i = 0; i
thinking();
eating();
}
}
public synchronized void thinking() {
if (state) { // 如果在思考,说明这个哲学家两面的筷子没用
chopstickArray.getId(id).setAvailable(true);
chopstickArray.getLast(id).setAvailable(true);
String text = thinkingTextArea.getText();
thinkingTextArea.setText(text + this + "在思考\n");
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
state = false;
}
@Override
public String toString() {
return " 哲学家 " + id;
}
}
4.运行的入口类
package com.bjs.dinning;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class DiningPhilosophersFrame extends JFrame{
public DiningPhilosophersFrame(){
panel2.setLayout(new GridLayout(2, 2, 3, 3));
panel2.add(label2);
panel2.add(label3);
panel2.add(label4);
JScrollPane js1 = new JScrollPane(thinkingTextArea,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
JScrollPane js2 = new JScrollPane(eatingTextArea,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
JScrollPane js3 = new JScrollPane(waitingTextArea,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
panel2.add(js1);
panel2.add(js2);
panel2.add(js3);
panel1.setLayout(new FlowLayout());
panel1.add(label1);
panel1.add(panel2);
panel1.add(button);
setContentPane(panel1);
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
ChopstickArray chopstickArray = new ChopstickArray(3);
for(int i = 0; i
new Thread(new Philosopher(i, chopstickArray,
thinkingTextArea, eatingTextArea, waitingTextArea))
.start();
}
}
});
setSize(300, 400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args){
new DiningPhilosophersFrame();
}
private final JPanel panel1 = new JPanel();
private final JPanel panel2 = new JPanel();
private final JTextArea thinkingTextArea = new JTextArea(5, 10);
private final JTextArea eatingTextArea = new JTextArea(5, 10);
private final JTextArea waitingTextArea = new JTextArea(5, 10);
JLabel label1 = new JLabel("哲学家问题");
JLabel label2 = new JLabel("思考");
JLabel label3 = new JLabel("吃饭");
JLabel label4 = new JLabel("等待");
JButton button = new JButton("开始运行");
}
哲学家就餐 java_java模拟哲学家就餐问题相关推荐
- php 哲学家进餐,IPC问题-哲学家就餐(示例代码)
如上图,有五位哲学家,盘中的食物只有左右两个叉子都拿起才能吃.哲学家在桌上只有思考(等待)和吃面(执行).看起来最多是只有2个人能同时吃. 版本一:这个思路的最糟糕的就是都拿起左边叉子,那样都没法吃了 ...
- 哲学家就餐问题python_哲学家就餐问题与死锁
问题描述 哲学家就餐问题(Dining philosophers problem)是在计算机科学中的一个经典问题,用来演示在并发计算中多线程同步(Synchronization)时产生的问题. 哲学家 ...
- java中哲学家就餐死锁_哲学家就餐问题与死锁总结
死锁的四个条件: (1) 互斥条件:一个资源每次只能被一个进程使用. (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放. (3) 不剥夺条件:进程已获得的资源,在末使用完之前 ...
- 哲学家就餐问题python_哲学家就餐-同步问题解析-python
五个哲学家吃五盘通心粉,由于通心粉很滑,所以必须要拿起左右两边的叉子才能吃到. 叉子的摆放如图所示. 那么问题来了:能为每一个哲学家写一段描述其行为的程序,保证不会出现死锁. 解法1:让他等待能够使用 ...
- Python模拟哲学家进餐问题
有两个哲学家坐在桌子上,桌子上放了两只筷子,编号分别是a和b,只有同时得到a.b两只筷子时哲学家才能吃饭,如果筷子a被哲学家1号抢到了,筷子b被哲学家2号抢到了,此时两位哲学家都想要得到对方手中的筷子 ...
- 马匹赛跑java_java模拟龟兔赛跑
通过使用 java 中 Jlabel,Jbutton,JtextArea,JcomboBox 等 swing 组件来实现图形用户界面,同 时通过设置布局,背景,字体等来丰富界面,最大程度的模拟龟兔赛跑 ...
- 模拟栈 java_Java 模拟栈结构
栈和队列: 通常是作为程序猿的工具,用于辅助构思算法.生命周期较短,执行时才被创建 訪问受限.在特定时刻,仅仅有一个数据可被读取或删除 是一种抽象的结构.内部的实现机制.对用户不可见.比方用数组.链表 ...
- h5拼手气红包java_Java模拟微信发红包(普通红包、拼手气红包)
假设红包总额M元,分给N个人. 满足条件: 如果是普通红包,每个人获得的金额都一样: 如果是拼手气红包,则有所区别,但不能金额过于离谱,比如第一个获得的太多,以至于后来的人都几乎没得分. 注意点: 1 ...
- 哲学家进餐问题(java模拟死锁及解决方案)
一.问题描述 哲学家进餐问题是由 Dijkstra 提出并解决的,该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和进餐.平时 ...
最新文章
- 阿里云总裁胡晓明:“这些新杭州故事,明天将会在更多城市发生”
- Windows批处理脚本%1和%1%有区别吗?
- 010_Select选择器
- flutter 刷脸_GitHub - hqwlkj/wechat_face_payment: 微信刷脸支付、刷脸认证、扫码支持等 Flutter 插件....
- SQL Server : 使用SQL Express的User Instance(用户实例)特性
- 【转】关于浮点数的精度与取值范围的问题
- 在线教育工具—白板系统的迭代1——bug监控排查
- JAVA 入门教程 2
- 在线预览CAD 在线预览office 在线预览3D模型
- 计算机人工智能领域英文文献,人工智能英文参考文献精选(3)
- web前端基础——Less语法
- 创业基础(第六章:创业资源及其管理) 来自高校:全国大学生创新创业实践联盟 分类:创新创业 学习规则:按序学习
- 学mysql后的收获_数据库课程学习的收获和心得体会
- Vue-cli 打包CSS、JS找不到路径问题,解决方案
- 使用Nuxt.js框架开发(SSR)服务端渲染项目
- fgets和fputs的使用
- Hannah荣获第六季完美童模全球总决赛全球人气总冠军
- SpringBoot | SpringBoot整合数据库
- 腾讯云 TRTC 监控仪表盘实用指南
- Linux优化,是为了更好应对数字标牌的应用挑战