美文网首页
哲学家问题——CVTE

哲学家问题——CVTE

作者: 远o_O | 来源:发表于2017-07-31 11:29 被阅读15次

    题目大意:

    • 哲学家问题,每一个都有自己的筷子,同时需要获取别人的筷子吃饭:
      • 1.获得筷子,吃饭1秒,然后赶紧放下筷子,思考3秒。
      • 2.否则思考。

    编码实现

    • 利用静态数组统一保存筷子,每个人的id和其中一个筷子绑定。没有自己的筷子,就不吃饭,哼(¬︿̫̿¬☆)。
    • synchroinized(class),锁定所有哲学家实例,保证线程安全。
    package interview.philosopherquestion;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**
     * 哲学家问题,每一个都有自己的筷子,同时需要获取别人的筷子吃饭:
     *  1.获得筷子,吃饭1秒,然后赶紧放下筷子,思考3秒。
     *  2.否则思考。
     */
    public class PhilosopherByMe extends Thread{
        //定义五个筷子:1表示可以使用,可以取筷子eating,0表示不可以使用,正在eating。。。
        private final static int[] ticks = {1, 1, 1, 1, 1};
        private final int id;//不可变,线程安全
        private int otherId;//只会在同步块中修改,线程安全
    
        /**
         * 每一个哲学家对应一个筷子
         * @param id
         */
        PhilosopherByMe(int id){
            this.id = id;
        }
    
        public void eating(){
            //锁住所有对象实例
            synchronized (PhilosopherByMe.class){
                if(ticks[id] == 1){
                    for(int i = 0; i < 5; ++i){
                        if(i != id){
                            //可以获得另外的筷子,eating!!!
                            if (ticks[i] == 1){
                                otherId = i;
                                ticks[i] = 0;
                                ticks[id] = 0;
                                //拿到铐子后,吃饭一秒。保持占有筷子,不能被其他sb拿走
                                System.out.println("哲学家" + id + "正在拿着" + id + " 和 " + otherId +" 号筷子吃饭!!!");
                                try {
                                    Thread.sleep(1000);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                                //吃完饭,溜了溜了。
                                return;
                            }
                        }
                    }
                }
            }
        }
    
        public void thinking(){
            synchronized (PhilosopherByMe.class){
                //放下自己的筷子和其他人的筷子
                if (ticks[id] == 0 && ticks[otherId] == 0){
                    ticks[id] = 1;
                    ticks[otherId] = 1;
                }
            }
    
            //放下筷子后,思考3秒
            System.out.println("哲学家" + id + "正在思考");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void run() {
            while (true){
                eating();
                thinking();
            }
        }
    
        public static void main(String[] args) {
            //5个哲学家,5个筷子
            ExecutorService executors = Executors.newFixedThreadPool(5);
            for(int i = 0; i < 5; ++i){
                executors.submit(new PhilosopherByMe(i));
            }
        }
    }
    
    

    相关文章

      网友评论

          本文标题:哲学家问题——CVTE

          本文链接:https://www.haomeiwen.com/subject/kowllxtx.html