废话不多说 直接上代码

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模拟哲学家就餐问题相关推荐

  1. php 哲学家进餐,IPC问题-哲学家就餐(示例代码)

    如上图,有五位哲学家,盘中的食物只有左右两个叉子都拿起才能吃.哲学家在桌上只有思考(等待)和吃面(执行).看起来最多是只有2个人能同时吃. 版本一:这个思路的最糟糕的就是都拿起左边叉子,那样都没法吃了 ...

  2. 哲学家就餐问题python_哲学家就餐问题与死锁

    问题描述 哲学家就餐问题(Dining philosophers problem)是在计算机科学中的一个经典问题,用来演示在并发计算中多线程同步(Synchronization)时产生的问题. 哲学家 ...

  3. java中哲学家就餐死锁_哲学家就餐问题与死锁总结

    死锁的四个条件: (1) 互斥条件:一个资源每次只能被一个进程使用. (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放. (3) 不剥夺条件:进程已获得的资源,在末使用完之前 ...

  4. 哲学家就餐问题python_哲学家就餐-同步问题解析-python

    五个哲学家吃五盘通心粉,由于通心粉很滑,所以必须要拿起左右两边的叉子才能吃到. 叉子的摆放如图所示. 那么问题来了:能为每一个哲学家写一段描述其行为的程序,保证不会出现死锁. 解法1:让他等待能够使用 ...

  5. Python模拟哲学家进餐问题

    有两个哲学家坐在桌子上,桌子上放了两只筷子,编号分别是a和b,只有同时得到a.b两只筷子时哲学家才能吃饭,如果筷子a被哲学家1号抢到了,筷子b被哲学家2号抢到了,此时两位哲学家都想要得到对方手中的筷子 ...

  6. 马匹赛跑java_java模拟龟兔赛跑

    通过使用 java 中 Jlabel,Jbutton,JtextArea,JcomboBox 等 swing 组件来实现图形用户界面,同 时通过设置布局,背景,字体等来丰富界面,最大程度的模拟龟兔赛跑 ...

  7. 模拟栈 java_Java 模拟栈结构

    栈和队列: 通常是作为程序猿的工具,用于辅助构思算法.生命周期较短,执行时才被创建 訪问受限.在特定时刻,仅仅有一个数据可被读取或删除 是一种抽象的结构.内部的实现机制.对用户不可见.比方用数组.链表 ...

  8. h5拼手气红包java_Java模拟微信发红包(普通红包、拼手气红包)

    假设红包总额M元,分给N个人. 满足条件: 如果是普通红包,每个人获得的金额都一样: 如果是拼手气红包,则有所区别,但不能金额过于离谱,比如第一个获得的太多,以至于后来的人都几乎没得分. 注意点: 1 ...

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

    一.问题描述 哲学家进餐问题是由 Dijkstra 提出并解决的,该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和进餐.平时 ...

最新文章

  1. 阿里云总裁胡晓明:“这些新杭州故事,明天将会在更多城市发生”
  2. Windows批处理脚本%1和%1%有区别吗?
  3. 010_Select选择器
  4. flutter 刷脸_GitHub - hqwlkj/wechat_face_payment: 微信刷脸支付、刷脸认证、扫码支持等 Flutter 插件....
  5. SQL Server : 使用SQL Express的User Instance(用户实例)特性
  6. 【转】关于浮点数的精度与取值范围的问题
  7. 在线教育工具—白板系统的迭代1——bug监控排查
  8. JAVA 入门教程 2
  9. 在线预览CAD 在线预览office 在线预览3D模型
  10. 计算机人工智能领域英文文献,人工智能英文参考文献精选(3)
  11. web前端基础——Less语法
  12. 创业基础(第六章:创业资源及其管理) 来自高校:全国大学生创新创业实践联盟 分类:创新创业 学习规则:按序学习
  13. 学mysql后的收获_数据库课程学习的收获和心得体会
  14. Vue-cli 打包CSS、JS找不到路径问题,解决方案
  15. 使用Nuxt.js框架开发(SSR)服务端渲染项目
  16. fgets和fputs的使用
  17. Hannah荣获第六季完美童模全球总决赛全球人气总冠军
  18. SpringBoot | SpringBoot整合数据库
  19. 腾讯云 TRTC 监控仪表盘实用指南
  20. Linux优化,是为了更好应对数字标牌的应用挑战

热门文章

  1. Spring Boot集成kafka完整版
  2. 物联网设计四大独特挑战的解决方案
  3. 面向未来的数据中心需要防止立法蠕变
  4. 终于知道10月27-28-29这3天为什么调整了
  5. 白话JAVA守护线程
  6. PHP跳转到另一个画面,并且带着该行内的一个数值作为参数传递给下一个页面.能给例子吗...
  7. linux线程函数大全
  8. 下拉列表框Spinner
  9. Automate repeatedly actions in work
  10. 实验4 [BX]和loop指令