package cn.Douzi.PhiEat;

/**
* 表示筷子的类
*/
public class Chopstick{ /**
* 表示筷子是否可用
*/
private volatile boolean available = true;
private int id; public Chopstick(){ } public Chopstick(int id){
this.id = id;
} public boolean isAvailable(){
return available;
} public void setAvailable(boolean available){
this.available = available;
} public int getId(){
return id;
} public void setId(int id){
this.id = id;
} @Override
public String toString(){
return "筷子" + id;
} }
package cn.Douzi.PhiEat;

public class ChopstickArray{

    private Chopstick[] chopsticks;

    public ChopstickArray(){

    }

    public ChopstickArray(int size) {
chopsticks = new Chopstick[size];
for(int i = 0; i < chopsticks.length; ++i){
chopsticks[i] = new Chopstick(i);
}
} public Chopstick getId(int id){
return chopsticks[id];
} //得到 编号id的筷子
public Chopstick getLast(int id){
if(id == 0){
return chopsticks[chopsticks.length - 1];
}else{
return chopsticks[id - 1];
}
} }
package cn.Douzi.PhiEat;

import java.awt.*;
import java.awt.event.*; import javax.swing.*; public class DiningPhilosophersFrame extends JFrame{ private final JPanel panel1 = new JPanel();
private final JPanel panel2 = new JPanel();
private final JPanel panel3 = new JPanel(); private final JTextArea thinkingTextArea = new JTextArea(6, 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("等待");
JLabel space = new JLabel(" "); JButton button = new JButton("开始运行");
JButton stop = new JButton("暂停"); public DiningPhilosophersFrame(){ panel2.setLayout(new GridLayout(2, 2, 3, 3));
panel3.setLayout(new BorderLayout()); label2.setFont(new Font("隶书", 0, 30));
label2.setHorizontalAlignment(0);
label3.setFont(new Font("隶书", 0, 30));
label3.setHorizontalAlignment(0);
label4.setFont(new Font("隶书", 0, 30));
label4.setHorizontalAlignment(0);
panel2.add(label2);
panel2.add(label3);
panel2.add(label4); thinkingTextArea.setEditable(false);
eatingTextArea.setEditable(false);
waitingTextArea.setEditable(false); 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);
// panel2.add(label2);
// panel2.add(label3);
// panel2.add(label4); panel2.setBackground(Color.LIGHT_GRAY);
panel1.setBackground(Color.LIGHT_GRAY); panel1.setLayout(new FlowLayout(FlowLayout.CENTER)); label1.setFont(new Font("隶书", 0, 50)); //标题字体 panel1.add(label1);
panel1.add(panel2); button.setBackground(Color.ORANGE);
stop.setBackground(Color.ORANGE); panel1.add(button);
panel1.add(space);
panel1.add(stop); setContentPane(panel1); button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
ChopstickArray chopstickArray = new ChopstickArray(5);
for(int i = 0; i < 5; i++){
new Thread(new Philosopher(i, chopstickArray,
thinkingTextArea, eatingTextArea, waitingTextArea))
.start();
}
}
}); stop.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try {
Thread.sleep(3000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}); setTitle("可爱的豆豆");
setSize(450, 400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} public static void main(String[] args){ new DiningPhilosophersFrame(); } }
package cn.Douzi.PhiEat;
import java.util.Random; import javax.swing.JTextArea; public class Philosopher implements Runnable{ private int id;
private boolean state;
ChopstickArray chopstickArray;
JTextArea thinkingTextArea;
JTextArea eatingTextArea;
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 thinking() {
if(state) {
// 如果在思考,说明这个哲学家两面的筷子没用
chopstickArray.getId(id).setAvailable(true);
chopstickArray.getLast(id).setAvailable(true);
String text = thinkingTextArea.getText();
thinkingTextArea.setText(text + this + "在思考\n");
thinkingTextArea.setCaretPosition(thinkingTextArea.getDocument().getLength());
thinkingTextArea.paintImmediately(thinkingTextArea.getBounds());
try{
Thread.sleep(1000);
}catch(Exception e){
e.printStackTrace();
}
}
state = false;
} 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");
eatingTextArea.setCaretPosition(eatingTextArea.getDocument().getLength());
eatingTextArea.paintImmediately(eatingTextArea.getBounds());
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");
waitingTextArea.setCaretPosition(waitingTextArea.getDocument().getLength());
waitingTextArea.paintImmediately(waitingTextArea.getBounds());
try{
wait(new Random().nextInt(100));
}catch(Exception e) {
e.printStackTrace();
}
}
}
state = true;
} @Override
public void run(){
for(int i = 0; i < 10; ++i){
thinking();
eating();
}
} @Override
public String toString(){
return " 哲学家 " + id;
} }

课程设计——利用信号量实现哲学家进餐问题(JAVA)的更多相关文章

  1. 课程设计——利用信号量实现生产者-消费者问题(java)

    package cn.Douzi.ProductConsume; import java.util.LinkedList; import java.util.Queue; import java.ut ...

  2. 课程设计——利用信号量实现读-写者问题(JAVA)

    package cn.Douzi.ReadWriter; import java.util.Scanner; public class ReadWrite { static public int co ...

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

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

  4. Operating System-进程/线程内部通信-信号量、PV操作的实现和应用(解决哲学家进餐和生产者消费者问题)

    本文主要内容: 信号量的实现 利用信号量解决哲学家用餐问题 利用信号量解决生产者消费者问题 一.信号量的实现 1.1 信号量结构 typedef struct { int value; struct ...

  5. JAVA课程设计+五子棋(团队博客)

    JAVA课程设计 利用所学习的JAVA知识设计一个五子棋小游戏 1.团队名称.团队成员介绍(菜鸟三人组) 杨泽斌[组长]:201521123049 网络1512 叶文柠[组员]:20152112305 ...

  6. Java课程设计---索引

    一.基础配置 ============================================================== 1.Java课程设计---Eclipse基本环境配置 2.J ...

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

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

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

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

  9. Bryce1010的操作系统课程设计

    https://download.csdn.net/download/fire_to_cheat_/10221003 上面是课程设计的代码,下载需要一些积分. 1.作业调度 2.磁盘调度 常见的磁盘调 ...

随机推荐

  1. 一个整数N中的1的个数

    设计思想: 通过大量数据分解找规律 abcd 从d开始若d=0则count(1的个数)=左边的abc *d的位值(1.10.100..) 若等欲1则count=左边的abc*d的位值(1.10.100 ...

  2. hihocoder #1032 : 最长回文子串 Manacher算法

    题目链接: https://hihocoder.com/problemset/problem/1032?sid=868170 最长回文子串 时间限制:1000ms内存限制:64MB 问题描述 小Hi和 ...

  3. 奇异值分解(SVD) --- 几何意义 (转载)

    PS:一直以来对SVD分解似懂非懂,此文为译文,原文以细致的分析+大量的可视化图形演示了SVD的几何意义.能在有限的篇幅把 这个问题讲解的如此清晰,实属不易.原文举了一个简单的图像处理问题,简单形象, ...

  4. CentOS卸载系统自带的OpenJDK并安装Sun的JDK的方法

    查看目前系统的jdk: rpm -qa | grep jdk 得到的结果: [root@dc-01 java]#  rpm -qa | grep jdk java-1.6.0-openjdk-1.6. ...

  5. oracle 数据库 命令

    SQL PLUS 命令: SELECT * FROM ALL_TABLES;系统里有权限的表SELECT * FROM DBA_TABLES; 系统表SELECT * FROM USER_TABLES ...

  6. BZOJ 2004 公交线路(状压DP+矩阵快速幂)

    注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include ...

  7. 【bzoj4709】[Jsoi2011]柠檬 斜率优化

    题目描述 给你一个长度为 $n$ 的序列,将其分成若干段,每段选择一个数,获得 $这个数\times 它在这段出现次数的平方$ 的价值.求最大总价值. $n\le 10^5$ . 输入 第 1 行:一 ...

  8. 【开发工具IDE】Eclipse相关配置

    1. 修改workspace编码为UTF-8 1.1. 修改jsp编码为UTF-8 2. 修改字体 3. 添加系统中的JDK 4. 导入formatter模板 5. 修改maven配置文件 打开文件: ...

  9. robot framework Selenium2关键字介绍

    *** Settings *** Library Selenium2Library *** Keywords *** Checkbox应该不被选择 [Arguments] ${locator} Che ...

  10. [BZOJ3172]单词

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MB Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会 ...