五位哲学家用餐问题相信大家也知道,大概就是五位哲学家在圆形餐桌上吃饭,每两位哲学家之间有一根筷子,即每位哲学家左右两边都有一根筷子,接下来哲学家的步骤是:拿起左右筷子用餐   =》中间放下左右筷子思考 =》继续拿起左右筷子用餐 =》用餐完毕,涉及到并发处理及死锁的避免问题

话不多说,上代码:

package com.PTakeUpChopStick;

public class ChopStick {

public boolean available = true;
    public int num;
    
    public ChopStick(int num) {
        // TODO Auto-generated constructor stub
        this.num = num;
    }
    
    public synchronized boolean takeup(int id) {
        if(available) {
//            System.out.println("哲学家" + id + "拿起" + "chop" + num + ":takeup");
            available = false;
            return true;
        }else {
            return false;
        }
    }
    
    public void putdown(int id) {
//        System.out.println("哲学家" + id + "放下" + "chop" + num + ":putdown");
        available = true;
    }
    
    
}

package com.PTakeUpChopStick;

public class Philosopher extends Thread{

private int id;
    private ChopStick leftChop; 
    private ChopStick rightChop; 
    
    public Philosopher(int id, ChopStick leftChop, ChopStick rightChop) {
        // TODO Auto-generated constructor stub
        this.id = id;
        this.leftChop = leftChop;
        this.rightChop = rightChop;
    }
    
    public void think() {
        
            leftChop.putdown(id);
            rightChop.putdown(id);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }
        
    @Override
    public void run() {
        // TODO Auto-generated method stub
        boolean bl=false;
        boolean br=false;
        while(!bl || !br) {
//            System.out.println(id+":left:" + leftChop.available);
//            System.out.println(id+":right:" + rightChop.available);
//            try {
//                Thread.sleep(100);
//            } catch (InterruptedException e) {
//                // TODO Auto-generated catch block
//                e.printStackTrace();
//            }
            bl = leftChop.takeup(id);
            br = rightChop.takeup(id);
            //解决拿起了一只筷子没有退出循环下次循环这只筷子没有被任何人占用却为false的问题
            if(bl ^ br) {    
                if(bl) {
                    leftChop.putdown(id);
                }
                if(br) {
                    rightChop.putdown(id);
                }
            }
        }
        
        try {
            System.out.println("哲学家" + id + ":用餐中。。。");
            Thread.sleep(100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        System.out.println("哲学家" + id + ":思考中。。。");
        think();
        
        bl=false;
        br=false;
        while(!bl || !br) {
//            System.out.println(id+":left:" + leftChop.available);
//            System.out.println(id+":right:" + rightChop.available);
//            try {
//                Thread.sleep(100);
//            } catch (InterruptedException e) {
//                // TODO Auto-generated catch block
//                e.printStackTrace();
//            }
            bl = leftChop.takeup(id);
            br = rightChop.takeup(id);
            if(bl ^ br) {
                if(bl) {
                    leftChop.putdown(id);
                }
                if(br) {
                    rightChop.putdown(id);
                }
            }
        }

try {
            System.out.println("哲学家" + id + ":用餐中。。。");
            Thread.sleep(100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

System.out.println("哲学家" + id + ":用餐完毕");       //用餐完毕,放下筷子让别人吃
        leftChop.putdown(id);
        rightChop.putdown(id);

}    
    
    
}

package com.PTakeUpChopStick;

public class PTakeUpChopStickTest {

static ChopStick[] chopsticks = new ChopStick[5];
    static Philosopher[] philos = new Philosopher[5];
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        for(int i = 0;i < 5;++i) {
            
            chopsticks[i] = new ChopStick(i);
        }
        
        for(int i = 0;i < 5;++i) {
            
            philos[i] = new Philosopher(i, chopsticks[i], chopsticks[(i+1)%5]);
        }
        
        for(int i = 0;i < 5;++i) {
            
            philos[i].start();
        }
    }

}

下面是运行截图:

Java算法完美解决五位哲学家用餐问题相关推荐

  1. 算法高级(40)-基于分治算法完美解决的人类基因组计划

    一.人类基因组计划 人类基因组计划(英语:Human Genome Project, HGP)是一项规模宏大,跨国跨学科的科学探索工程.其宗旨在于测定组成人类染色体(指单倍体)中所包含的30亿个碱基对 ...

  2. 易阳指 java_摩托罗拉 XT800 不支持 java 的完美解决教程

    入手xt800不到一月,版本是2.01(15.15.3),当初主要是看中了它的强劲处理器.高清触摸屏以及双网双待功能.我用手机偏重商务,电话.短信自不待言,浏览网页和手机炒股是我最看重的,游戏倒是可有 ...

  3. js java base64,JavaScript BASE64算法实现(完美解决中文乱码)

    这篇文章主要介绍了JavaScript BASE64算法实现(完美解决中文乱码),先用escape()对中文进行编码.然后再进行base64编码. 解码时,再加入()对中文进行解码,这样就可以避免中文 ...

  4. Adobe flash cs5 的Java运行时环境初始化错误 完美解决方法

    Adobe flash cs5 的Java运行时环境初始化错误 完美解决方法 下载网络上的Adobe flash cs5 精简版(绿色版),Java运行时环境初始化时出现错误,你可能需要重装Flash ...

  5. 完美解决Invalid layout of java.lang.String at value问题的方法

    完美解决Invalid layout of java.lang.String at value问题的方法 参考文章: (1)完美解决Invalid layout of java.lang.String ...

  6. JAVA之NIO按行读写大文件,完美解决中文乱码问题

    JAVA之NIO按行读写大文件,完美解决中文乱码问题 参考文章: (1)JAVA之NIO按行读写大文件,完美解决中文乱码问题 (2)https://www.cnblogs.com/jpfss/p/89 ...

  7. java网络爬虫,乱码问题终于完美解决

    java网络爬虫,乱码问题终于完美解决 参考文章: (1)java网络爬虫,乱码问题终于完美解决 (2)https://www.cnblogs.com/-LilyBlog-/p/7593841.htm ...

  8. android classes2.dex,原创??近乎完美解决AndroidKiller不提取classes2+.dex JAVA源码的问题...

    本帖最后由 NoZuoNo代 于 2019-12-23 11:00 编辑 入坛多年了,还是第一次发帖(大家不要以为是我低调,而是  我太白了简直纯白不知道发什么 )  没想到多年前还是个小白的我现如今 ...

  9. Java使用动态规划算法思想解决01背包问题

    Java使用动态规划算法思想解决背包问题 背包问题是一种组合优化的NP完全问题.问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高 动 ...

最新文章

  1. 游戏产品开发流程-leangoo
  2. pandas KeyError [‘1‘] not found in axis 错误的解决方法
  3. 干货丨卷积神经网络工作原理的直观解释
  4. 2019年最新最全运维技能图谱
  5. python_魔法方法(六):迭代器和生成器
  6. 笨人可以学计算机吗,为什么有的笨人一旦开窍,其人生就像开了挂似的呢?
  7. macosx jdk_MacOSX环境上的多个Java JDK
  8. 再介绍一篇Contrastive Self-supervised Learning综述论文
  9. 解决Scrapy使用pipline保存到数据库后返回None
  10. C++ HOOK 详解
  11. [小程序]_ELVE_小程序开发(1)
  12. VMware、vSphere 6.0 介绍
  13. 类似taobao的多彩选项卡tab
  14. ios android 系统字体,ios、android 系统字体说明
  15. R60笔记本电脑风扇清理加油过程
  16. 第五人格显示服务器维护中请稍后登录怎么办,《第五人格》未知异常 请稍后重试登不上去如何解决...
  17. 【3D动态思维导图制作软件】万彩脑图大师教程 | 添加声音跟字幕
  18. 绝热锥形与adc psr
  19. 华为电脑计算机怎么显示在桌面,电脑桌面小便签,华为电脑怎么设置桌面便签...
  20. 英雄无敌3 Heroes III 里面的英语单词 (转)

热门文章

  1. 如何查看Oracle数据库版本
  2. 从事计算机行业考MBA有用吗,什么行业需要考mba
  3. IT运维管理的服务内容包括哪些
  4. 联想拯救者7000充不上电的解决办法
  5. oneDrive 无法连接
  6. python编程工具-7款Python开发工具介绍,你最中意哪一款
  7. 幻影坦克制作流程和步骤
  8. js中json数组 和 字符串 互转
  9. 二项分布、泊松分布,正态分布(高斯分布)之间的联系与区别
  10. 《詹姆斯·高斯林Java白皮书1996自译》07:多线程