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开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!