首页 > 其他分享 >哲学家就餐问题

哲学家就餐问题

时间:2023-12-02 19:34:44浏览次数:32  
标签:就餐 right 哲学家 Chopstick philosopher System 问题 new left

package com.shenzhen.dai;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Philosopher extends Thread {
    @Data
    @AllArgsConstructor
    static class Chopstick {
        private int id;

    }

    private String name;
    private Chopstick left, right;
    private Random random;

    Philosopher(String name, Chopstick left, Chopstick right) {
        this.name = name;
        this.left = left;
        this.right = right;
        random = new Random();
    }

    private void doAction(String action, Integer seconds) throws InterruptedException {
        System.out.println(
                Thread.currentThread().getName() + " " + action);
        Thread.sleep(((int) (Math.random() * 10 * seconds)));
    }

    @Override
    public void run() {
        try {
            while (true) {
                synchronized (left) {
                    doAction("pick left c", 1);
                    synchronized (right) {
                        doAction("pick right c and eating", 1);
                        doAction("pick down right c", 1);
                    }
                    doAction("pick down left c", 1);
                }
            }
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        List<Philosopher> philosopherList = new ArrayList<>();
        List<Object> forks = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            forks.add(new Chopstick(i + 1));
        }
        for (int i = 0; i < forks.size(); i++) {
            Chopstick left = (Chopstick) forks.get(i);
            Chopstick right = (Chopstick) forks.get((i + 1) % forks.size());
            Philosopher philosopher = null;
            if (System.identityHashCode(left) < System.identityHashCode(right)) {
                philosopher = new Philosopher(("name" + i + 1), left, right);
            } else {
                philosopher = new Philosopher(("name" + i + 1), right, left);
            }
            philosopherList.add(philosopher);
        }
        for (Philosopher philosopher : philosopherList) {
            philosopher.start();
            System.out.println("System.identityHashCode(philosopher) = " + System.identityHashCode(philosopher));
        }
    }
}

标签:就餐,right,哲学家,Chopstick,philosopher,System,问题,new,left
From: https://www.cnblogs.com/alvisClub/p/17872094.html

相关文章

  • nginx 的安全策略问题
    1:前端嵌入iframe时,有时汇报安全策略如下:inaframebecauseanancestorviolatesthefollowingContentSecurityPolicydirective:"frame-ancestors‘self’。这里主要是frame-ancestors的参数需要调整。#不允许被嵌入,包括<frame>,<iframe>,<object>,<embed>和<appl......
  • 记一次OceanBase的线上问题排查
    问题是什么数据库报错Error1366(HY000):Incorrectstringvalue具体情况复现插入语句insertignoreintouser(name,disc_content)selectt1.name,group_concat(concat('{"评论人":"',t1.author,'","解决人":&q......
  • java: 未报告的异常错误java.io.UnsupportedEncodingException; 必须对其进行捕获或声
    原问题代码:/**MD5编码相关的类@authorwangjingtao*/publicclassMD5{//首先初始化一个字符数组,用来存放每个16进制字符privatestaticfinalchar[]hexDigits={'0','1','2','3','4','5','6','7'......
  • 使用unity开发Pico程序,场景中锯齿问题
    1、问题使用unity【非HDR】开发Pico程序,场景中锯齿问题,设置了unity的抗锯齿和渲染方式,及悬挂抗锯齿的脚本,都不能很好的解决项目中图片、文字的锯齿问题,通过摸索找到了妥善的方法1、修改项目中图片的GenerateMIpMaps为勾选状态,MipMapsPreserveCoverage这个可以未勾选,若是勾选......
  • 最简单的方式解决Intel大小核调度问题
    现在Intel的大小核调度逻辑主要有个问题是窗口不在焦点可能会被扔到小核。修改完后的逻辑:无论前台还是后台,无论轻负载还是高负载,全部优先使用大核,此时处理器和你关闭小核逻辑差不多。只有大核全部满载,忙不过来时,小核会开始介入,例如多核压缩,压制,跑分等。我个人觉得这种调度非常完......
  • 使用Navicat For MSSQL连接绿色版SQLServer2008R2问题解决
    问题1、创建连接时出现错误:[IM002][Microsoft][ODBC驱动程序管理器]未发现数据源名称并且未指定默认驱动程序(0)Navicat来连接SQLserver,这里确实有点麻烦,出现错误[IM002][Microsoft][ODBC驱动程序管理器]未发现数据源名称并且未指定默认驱动程序(0),解决方法:进入Navicat的安装......
  • 模型部署的一些问题及其解决方案
    #1.显示<PIL.Image.Imageimagemode=RGBsize=512x512at0x7A12021134C0>图片并保存得到一个<PIL.Image.Imageimagemode=RGBsize=512x512at0x7A12021134C0>的Image对象importmatplotlib.pyplotaspltplt.imshow(image)plt.show()image.save("./duck.png......
  • foxy rviz2 "rviz_common/Time"报错问题
    报错内容Theclassrequiredforthispanel,'rviz_common/Time',couldnotbeloaded.Error:Accordingtotheloadedplugindescriptionstheclassrviz_common/Timewithbaseclasstyperviz_common::Paneldoesnotexist.DeclaredtypesareTeleopPanel......
  • 总结-解决国内服务器、nas 、docker访问国外网站、更新镜像、遇到的问题
    proxy可以通过修改环境变量,添加代理协议、服务器ip和端口,可以解决访问github、google等网站的问题,同时会遇到国内外分流、ipv6访问等问题。详细可以寻找projectX。解决DNS的问题运营商的dns存在着污染的情况,导致一些网页解析到了无法访问的ip,可以通过以下方法解决。修改DNS......
  • INFINI Labs 产品更新 | 修复 Easysearch 跨集群复制索引同步问题,Gateway 内存异常增
    INFINILabs产品又更新啦~,本次更新主要对Easysearch、Gateway、Console、Agent等产品功能进行优化和相关Bug修复,解决了内存异常增长等问题,以下是详细说明。INFINIEasysearchv1.6.2INFINIEasysearch是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的ApacheLucene......