`
sekiyika
  • 浏览: 11622 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

用Java实现的银行家算法

阅读更多

应操作系统老师的要求:下节课我们来一起讨论一下银行家算法的实现,银行家算法的优化,银行家算法在各个领域的具体实现方式和优化;上来讲的人,我会在他期末考试成绩上直接加5分。

 

这些可爽了我,虽然我已经可以加5分,但是争取吧,所以也些了个模拟银行家算法,但是...可惜,可惜...没上去讲,又不甘心自己就这样白写了,所以贴出来大家一起看看:

 

package com.littleworks.bankerAlgorithm;

import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Banker {

    List<Borrower> safeSequence = new ArrayList<Borrower>();
    List<Resource> resources = new ArrayList<Resource>();
    List<Borrower> borrowers = new ArrayList<Borrower>();

    /**
     * Constructor
     */
    Banker() {
        init();
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        Banker banker = new Banker();
        banker.think();

    }

    /**
     * 初始化
     * 在这里添加借贷者和资源,可以手动在这里修改借贷者里的各个属性,可以设置allocation
     */
    private void init() {
        Resource resource1 = new Resource("resource1", 3);
        this.addResource(resource1);
        Resource resource2 = new Resource("resource2", 2);
        this.addResource(resource2);
        Borrower borrower1 = new Borrower("borrower1");
        this.addBorrower(borrower1);
        Borrower borrower2 = new Borrower("borrower2");
        this.addBorrower(borrower2);
    }

    /**
     * 往银行里增加资源的种类
     *
     * @param resource
     */
    public void addResource(Resource resource) {
        this.resources.add(resource);

        Borrower b = null;
        for (int i = 0; i < this.borrowers.size(); i++) {
            b = borrowers.get(i);
            b.need.put(resource, 0);
            b.allocation.put(resource, 0);
            b.max.put(resource, 0);
            b.request.put(resource, 0);
        }
    }

    /**
     * 往银行里增加借贷者的人数
     *
     * @param borrower
     */
    public void addBorrower(Borrower borrower) {

        int j = 0;
        for (int i = 0; i < resources.size(); i++) {
            j = 0;
            InputStreamReader isr = new InputStreamReader(System.in);
            System.out.println("请输入借贷者" + borrower.name + "对资源"
                    + resources.get(i).getName() + "请求的数量:");

            try {
                j = isr.read() - 48;
            } catch (IOException e) {
                e.printStackTrace();
            }

            borrower.need.put(resources.get(i), j);
            borrower.max.put(resources.get(i), j);
            borrower.allocation.put(resources.get(i), 0);
            borrower.request.put(resources.get(i), j);

        }

        this.borrowers.add(borrower);
    }

    /**
     * 银行家算法
     */
    public void think() {

        for (Borrower borrower : borrowers) {
            for (Resource resource : resources) {
                // 1. 如果request向量比need还大,则意味着出错:进程请求的资源多余它自身的需求量
                if (borrower.request.get(resource) > borrower.need
                        .get(resource)) {
                    System.out.println("好你小子,吃着碗里的看着锅里的是吧......看我不灭了你");
                    this.deleteBorrowerByName(borrower.name);
                }

                // 2. 如果request向量比系统目前有的资源量多,则不能满足,让你先等待
                else if (borrower.request.get(resource) > resource
                        .getAvailable()) {
                    System.out.println(borrower.name
                            + ",你先等一等,目前你的资源不能全部满足,我看看怎么分配比较好...");
                }
            }
        }

        List<Resource> work = new ArrayList<Resource>();
        for (Resource r : resources) {
            work.add(r);
        }
        List<Borrower> finish = new ArrayList<Borrower>();
        for (Borrower b : borrowers) {
            finish.add(b);
        }

        while (true) {

            boolean isOver = true;
            Resource resource = null;
            Borrower borrower = null;
            boolean has = true;
            out: for (int i = 0; i < finish.size(); i++) {
                borrower = finish.get(i);

                if (!borrower.status) {
                    for (int j = 0; j < work.size(); j++) {
                        resource = work.get(j);
                        if (finish.get(i).need.get(resource) > resource
                                .getAvailable()) {
                            has = false;
                            break;
                        }
                    }
                    if (has) {
                        break out;
                    }
                }
            }

            if (has && safeSequence.size() != finish.size()) {
                resource.setAvailable(resource.getAvailable()
                        + borrower.allocation.get(resource));
                borrower.status = true;
                safeSequence.add(borrower);
                System.out.println(borrower.name);
                continue;
            } else {

                for (Borrower b : safeSequence) {
                    if (!b.status) {
                        isOver = false;
                        break;
                    }
                }
                if (isOver && safeSequence.size() != 0) {
                    System.out.println("此状态安全!");
                } else
                    System.out.println("此状态不安全!");
                break;
            }
        }

    }

    /**
     * 根据名字从借贷者链表中删掉
     *
     * @param name
     */
    public void deleteBorrowerByName(String name) {
        int position = 0;
        for (; position < borrowers.size(); position++) {
            if (borrowers.get(position).name.equals(name)) {
                break;
            }
        }
        borrowers.remove(position);
    }
}

class Borrower {

    // 借贷者的名字
    String name;
    // 改借贷者当前是否完成任务, true为完成
    boolean status = false;

    // 当前还需要各种资源的数量
    Map<Resource, Integer> need = new HashMap<Resource, Integer>();

    // 对资源的最大请求量
    Map<Resource, Integer> max = new HashMap<Resource, Integer>();

    // 已经被分配的各资源量
    Map<Resource, Integer> allocation = new HashMap<Resource, Integer>();

    // 当前对银行请求的量
    Map<Resource, Integer> request = new HashMap<Resource, Integer>();

    Borrower(String name) {
        this.name = name;
    }
}

class Resource {
   
    // 资源的名字
    private String name;

    // 该资源可用量
    private int available;

    Resource(String name, int available) {
        this.available = available;
        this.name = name;
    }

    public int getAvailable() {
        return available;
    }

    public void setAvailable(int available) {
        this.available = available;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

 

这个还是有点问题的,因为我把借贷者的allocation都最开始就设置为了0,所以如果有安全序列,则安全序列输出的顺序一定是你往借贷者链表中加入的顺序,不过这完全可以改,在init方法中你可以自己手动设置各个借贷者的已分配的资源数量allocation


还有一个就是,也是由于初始化为0的缘故,就是条件1是永远都到不了的,也就是说:好你小子,吃着碗里的看着锅里的是吧......看我不灭了你,这句话永远不会输出,因为添加借贷者时,need和reuest都是被初始化为了同一个值,但是也是可以修改的,在init方法中你可以自己手动设置各个借贷者的request或者need

 

 

 

就写这些了,谢谢大家耐心的看!

  • Banker.rar (1.9 KB)
  • 描述: 源文件
  • 下载次数: 38
1
0
分享到:
评论
4 楼 sekiyika 2010-04-26  
rchild 写道
这样你操作系统不几乎满分?

呃……还好吧~最后是94,呵呵
3 楼 rchild 2010-04-23  
这样你操作系统不几乎满分?
2 楼 sekiyika 2009-04-23  
jmu 写道

下次一定要上去讲,不要给任何人机会! 任何人!

e...好吧,听你的,不要给别人机会
不给别人机会就是对自己的仁慈!
1 楼 jmu 2009-04-23  
下次一定要上去讲,不要给任何人机会! 任何人!

相关推荐

    java实现银行家算法代码

    用java实现银行家调度算法,避免进程死锁!

    java实现银行家算法

    《Java实现银行家算法详解》 银行家算法是一种经典的避免死锁的策略,它通过预分配资源和安全性检查来防止系统进入不安全状态。在Java中实现银行家算法,主要涉及线程同步、随机资源分配以及安全性判断等关键步骤。...

    java实现银行家算法(GUI界面)A+报告

    Java实现银行家算法(GUI界面)A+报告 银行家算法是操作系统中避免死锁的一种经典算法,由Dijkstra提出。该算法可以有效地避免操作系统中出现死锁的问题。本文将详细介绍如何使用银行家算法来处理操作系统给进程分配...

    基于java实现银行家算法的源码资料.zip

    银行家算法基于java实现银行家算法的源码资料.zip银行家算法基于java实现银行家算法的源码资料.zip银行家算法基于java实现银行家算法的源码资料.zip银行家算法基于java实现银行家算法的源码资料.zip银行家算法基于...

    java实现银行家算法(Swing界面)

    下面我们将通过 Java 语言来实现银行家算法,并使用 Swing 库来设计一个友好的图形用户界面。 银行家算法简介 银行家算法是一种避免死锁和饥饿的算法,它通过对系统中的资源进行分配,以避免系统中的进程产生死锁...

    java实现简单银行家算法

    标签包括 Java 和 银行家算法,表示本文的主要内容是使用 Java 语言实现银行家算法。 四、知识点解释 4.1 银行家算法的基本概念 银行家算法是操作系统中的一种避免死锁的方法,它可以判断是否存在安全状态,从而...

    银行家算法JAVA代码实现,附带图形化界面

    通过这个Java实现,学习者不仅可以了解银行家算法的基本原理,还可以深入理解如何将算法转化为实际代码,并结合图形界面增强用户体验。这不仅对于学习操作系统和并发编程有所帮助,也是提升软件工程实践能力的良好...

    银行家算法java实现

    ### 银行家算法Java实现详解 #### 一、银行家算法简介 银行家算法是一种避免死锁的策略,由Edsger Dijkstra提出。该算法主要用于操作系统中管理资源分配,通过模拟银行家对客户的贷款行为来预防系统陷入死锁状态。...

    使用java实现银行家算法

    "使用Java实现银行家算法" 银行家算法是操作系统中的一种资源分配算法,用于避免死锁和饥饿现象。该算法的主要思想是,系统中有多个资源和进程,进程需要请求资源来执行任务,系统需要确保资源的分配是安全的,即...

    银行家算法java实现带UI界面(修正版)

    《银行家算法Java实现带UI界面详解》 银行家算法,由荷兰计算机科学家艾兹格·迪科斯彻提出,是一种预防死锁的策略,它主要用于操作系统中资源的分配,以确保系统的安全性。该算法的核心在于预先分配一部分资源,...

    分别应用Java和Python实现银行家算法

    银行家算法:分别应用Java和Python实现银行家算法; 银行家算法:分别应用Java和Python实现银行家算法; 银行家算法:分别应用Java和Python实现银行家算法; 银行家算法:分别应用Java和Python实现银行家算法; 银行...

    银行家算法Java实现带图形界面

    【银行家算法】是Dijkstra提出的一种用于避免操作系统中死锁的策略。...Java实现的银行家算法图形界面可以直观地展示资源分配过程,帮助用户理解死锁的预防策略,并提供了一个实验平台来模拟和分析系统资源分配的情况。

    java银行家算法(带界面)

    Java银行家算法是一种经典的资源分配和死锁预防算法,它源于操作系统领域,主要用于解决多进程环境中的资源竞争问题。在银行家算法中,系统被模拟为一个银行,进程是银行的客户,而资源则被视为银行的存款。这个算法...

    基于 Java 实现银行家算法【100011124】

    本实验分为五个小实验,实验一的目的是模拟在单处理器环境下的处理器调度,加深了解处理器调度的工作。实验二的目的是理解在不同的存储管理方式下应怎样进行存储空间...实验五的目的是了解死锁的避免,掌握银行家算法。

    JAVA图形化界面银行家算法

    在JAVA图形化界面中实现银行家算法,通常包括以下几个关键部分: 1. **数据结构**:定义资源和进程的数据结构,如进程、资源类,用于存储每个进程的资源需求、已分配资源和最大需求,以及系统的总资源数量。 2. **...

    JAVA操作系统课设作业银行家算法图形化模拟程序

    在这个JAVA16编写的程序中,我们看到一个银行家算法的实现,具有图形化用户界面(GUI),使得用户可以直观地理解该算法的工作原理。 1. **银行家算法**:这是解决资源分配问题的一种预防策略。它假设系统有一个可...

    银行家算法 操作系统作业 java模拟银行家算法,图形界面

    《银行家算法在操作系统中的应用——Java实现及图形界面》 银行家算法是操作系统中用于避免死锁的一种著名策略,由艾兹格·迪杰斯特拉在1965年提出。它主要用于解决资源分配问题,确保系统的安全性,防止因不当的...

Global site tag (gtag.js) - Google Analytics