Java~操作系统实验 模拟电梯调度算法,实现对磁盘的调度。

private Head head;

public static final int MaximumTrack = 200;

//在构造函数里初始化磁头

public DiskScheduling(int index, String direction) {

this.head = new Head(index, direction);

}

//需要一个方法往链表为添加程序

public void add(int[] tracks) throws InterruptedException {

//创建线程 线程的名字就是他有寻找的磁道地址

for (int track : tracks

) {

MyRunnable myRunnable = new MyRunnable(track);

threadList.add(myRunnable);

}

//将链表按要寻道的地址进行排序

threadList.sort(new Comparator() {

@Override

public int compare(MyRunnable o1, MyRunnable o2) {

return o1.track - o2.track;

}

});

this.start();

this.join();

//worke();

}

@Override

public void run() {

while (this.count != threadList.size()) {

while (this.head.direction.equals(“right”)) {

for (MyRunnable m : threadList

) {

if (m.track >= head.index && m.key) {

count++;

int distance = m.track - this.head.index;

sum += distance;

this.head.index = m.track;

m.key = false;

m.run();

//threadList.remove(m);

}

this.head.direction = “left”;

}

}

while (this.head.direction.equals(“left”)) {

for (int i = threadList.size() - 1; i >= 0; i–) {

if (threadList.get(i).track > this.head.index || !threadList.get(i).key) {

continue;

}

//此时表示找到了比现在下标小的

this.count++;

int distance = this.head.index - threadList.get(i).track;

sum += distance;

this.head.index = threadList.get(i).track;

threadList.get(i).key = false;

this.threadList.get(i).run();

//this.threadList.remove(this.threadList.get(i));

}

this.head.direction = “right”;

}

}

}

/* //需要一个方法去执行程序

private void worke() throws InterruptedException {

while (! this.threadList.isEmpty()) {

while (this.head.direction.equals(“right”)) {

synchronized (this) {

for (Thread t : this.threadList

) {

if (Integer.parseInt(t.getName()) > this.head.index) {

this.count++;

int distance = Integer.parseInt(t.getName()) - this.head.index;

sum += distance;

this.head.index = Integer.parseInt(t.getName());

t.start();

t.join();

this.threadList.remove(t);

}

}

}

this.head.direction = “left”;

}

while (this.head.direction.equals(“left”)) {

synchronized (this) {

for (int i = this.threadList.size() - 1; i >= 0; i–) {

if (Integer.parseInt(this.threadList.get(i).getName()) > this.head.index) {

continue;

}

//此时表示找到了比现在下标小的

this.count++;

int distance = this.head.index - Integer.parseInt(this.threadList.get(i).getName());

sum += distance;

this.head.index = Integer.parseInt(this.threadList.get(i).getName());

this.threadList.get(i).start();

this.threadList.get(i).join();

this.threadList.remove(this.threadList.get(i));

}

}

this.head.direction = “right”;

}

}

}*/

//需要一个方法返回平均寻道长度

public float averageSeekLength () {

return (float) ((this.sum * 1.0) / this.count);

}

}

  • 测试

假设磁盘有200个磁道,用C语言随机函数随机生成一个磁道请求序列(不少于15个)放入模拟的磁盘请求队列中,假定当前磁头在100号磁道上,并向磁道号增加的方向上移动。请给出按电梯调度算法进行磁盘调度时满足请求的次序,并计算出它们的平均寻道长度。

import java.util.Arrays;

import java.util.Random;

public class DiskTest {

public static void main(String[] args) throws InterruptedException {

//需要在创建磁盘调度的时候说明此时磁头的位置和方向

DiskScheduling diskScheduling = new DiskScheduling(100, “right”);

//生成15个随机数

int[] nums = new int[15];

for (int i = 0; i < 15; i++) {

Random random = new Random();

nums[i] = random.nextInt(DiskScheduling.MaximumTrack);

}

System.out.println(“初始申请序列:”);

System.out.println(Arrays.toString(nums));

System.out.println(“=========================”);

System.out.println(“电梯调度执行顺序”);

diskScheduling.add(nums);

System.out.println();

//等线程执行完毕再去打印寻道

diskScheduling.join();

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
.(img-k7woPHXF-1715716477548)]

[外链图片转存中…(img-sfYWfIDJ-1715716477549)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值