Main.java
import java.awt.EventQueue;
public class Main {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Design frame = new Design();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
Algorithm.java
import java.util.ArrayList;
//磁盘调度算法
public class Algorithm {
static ArrayList<Track> finishedList = new ArrayList<Track>(); //算法调度后磁道信息装入该表
static double averDistance;// 平均移动距离
// FCFS
public static void fcfs(ArrayList<Track> unfinishedList, int startNum) {//参数为请求队列,开始磁道号
int preNum = startNum;//上一磁道号
while (unfinishedList.isEmpty() == false) {//请求队列非空,进行调度算法
unfinishedList.get(0).distance = Math.abs(unfinishedList.get(0).num - preNum);//计算移动距离
preNum = unfinishedList.get(0).num;
finishedList.add(unfinishedList.get(0));
unfinishedList.remove(0);
}
double sum = 0;
for (int i = 0; i < finishedList.size(); i++) {
sum += finishedList.get(i).distance;
}
averDistance = sum / finishedList.size();
}
// SSTF
public static void sstf(ArrayList<Track> unfinishedList, int startNum) {
Track min = unfinishedList.get(0);//最小距离的磁道
int preNum = startNum;
while (unfinishedList.isEmpty() == false) {
for (int i = 1; i < unfinishedList.size(); i++) {
if (Math.abs(min.num - preNum) > Math.abs(unfinishedList.get(i).num - preNum)) {
min = unfinishedList.get(i);
}
}
min.distance = Math.abs(min.num - preNum);
finishedList.add(min);
unfinishedList.remove(min);
preNum = min.num;
if (unfinishedList.isEmpty() == false) {
min = unfinishedList.get(0);
}
}
double sum = 0;
for (int i = 0; i < finishedList.size(); i++) {
sum += finishedList.get(i).distance;
}
averDistance = sum / finishedList.size();
}
// SCAN,开始时磁头移动方向为由里向外,再由外向里
public static void scan_1(ArrayList<Track> unfinishedList, int startNum) {
ArrayList<Track> list_1 = new ArrayList<Track>();//将由里向外的磁道号装入该表
ArrayList<Track> list_2 = new ArrayList<Track>();//将由外向里的磁道号装入该表
for (int i = 0; i < unfinishedList.size(); i++) {
if (unfinishedList.get(i).num >= startNum) {
list_1.add(unfinishedList.get(i));
} else {
list_2.add(unfinishedList.get(i));
}
}
numSort_1(list_1);//小到大排序
numSort_2(list_2);//大到小排序
int preNum = startNum;
while (list_1.isEmpty() == false) {
list_1.get(0).distance = Math.abs(list_1.get(0).num - preNum);
preNum = list_1.get(0).num;
finishedList.add(list_1.get(0));
list_1.remove(list_1.get(0));
}
while (list_2.isEmpty() == false) {
list_2.get(0).distance = Math.abs(list_2.get(0).num - preNum);
preNum = list_2.get(0).num;
finishedList.add(list_2.get(0));
list_2.remove(list_2.get(0));
}
double sum = 0;
for (int i = 0; i < finishedList.size(); i++) {
sum += finishedList.get(i).distance;
}
averDistance = sum / finishedList.size();
}
// SCAN,开始时磁头移动方向为由外向里,再由里向外
public static void scan_2(ArrayList<Track> unfinishedList, int startNum) {
ArrayList<Track> list_1 = new ArrayList<Track>();//将由外向里的磁道号装入该表
ArrayList<Track> list_2 = new ArrayList<Track>();//将由里向外的磁道号装入该表
for (int i = 0; i < unfinishedList.size(); i++) {
if (unfinishedList.get(i).num <= startNum) {
list_1.add(unfinishedList.get(i));
} else {
list_2.add(unfinishedList.get(i));
}
}
numSort_2(list_1);//大到小排序
numSort_1(list_2);//小到大排序
int preNum = startNum;
while (list_1.isEmpty() == false) {
list_1.get(0).distance = Math.abs(list_1.get(0).num - preNum);
preNum = list_1.get(0).num;
finishedList.add(list_1.get(0));
list_1.remove(list_1.get(0));
}
while (list_2.isEmpty() == false) {
list_2.get(0).distance = Math.abs(list_2.get(0).num - preNum);
preNum = list_2.get(0).num;
finishedList.add(list_2.get(0));
list_2.remove(list_2.get(0));
}
double sum = 0;
for (int i = 0; i < finishedList.size(); i++) {
sum += finishedList.get(i).distance;
}
averDistance = sum / finishedList.size();
}
//CSCAN,磁头移动方向始终为由里向外
public static void cscan_1(ArrayList<Track> unfinishedList, int startNum) {
ArrayList<Track> list_1 = new ArrayList<Track>();//大于开始磁道号的磁道装入该表
ArrayList<Track> list_2 = new ArrayList<Track>();//小于开始磁道号的磁道装入该表
for (int i = 0; i < unfinishedList.size(); i++) {
if (unfinishedList.get(i).num >= startNum) {
list_1.add(unfinishedList.get(i));
} else {
list_2.add(unfinishedList.get(i));
}
}
numSort_1(list_1);//小到大排序
numSort_1(list_2);//小到大排序
int preNum = startNum;
while (list_1.isEmpty() == false) {
list_1.get(0).distance = Math.abs(list_1.get(0).num - preNum);
preNum = list_1.get(0).num;
finishedList.add(list_1.get(0));
list_1.remove(list_1.get(0));
}
while (list_2.isEmpty() == false) {
list_2.get(0).distance = Math.abs(list_2.get(0).num - preNum);
preNum = list_2.get(0).num;
finishedList.add(list_2.get(0));
list_2.remove(list_2.get(0));
}
double sum = 0;
for (int i = 0; i < finishedList.size(); i++) {
sum += finishedList.get(i).distance;
}
averDistance = sum / finishedList.size();
}
//CSCAN,磁头移动方向始终为由外向里
public static void cscan_2(ArrayList<Track> unfinishedList, int startNum) {
ArrayList<Track> list_1 = new ArrayList<Track>();//小于开始磁道号的磁道装入该表
ArrayList<Track> list_2 = new ArrayList<Track>();//大于开始磁道号的磁道装入该表
for (int i = 0; i < unfinishedList.size(); i++) {
if (unfinishedList.get(i).num <= startNum) {
list_1.add(unfinishedList.get(i));
} else {
list_2.add(unfinishedList.get(i));
}
}
numSort_2(list_1);//大到小排序
numSort_2(list_2);//大到小排序
int preNum = startNum;
while (list_1.isEmpty() == false) {
list_1.get(0).distance = Math.abs(list_1.get(0).num - preNum);
preNum = list_1.get(0).num;
finishedList.add(list_1.get(0));
list_1.remove(list_1.get(0));
}
while (list_2.isEmpty() == false) {
list_2.get(0).distance = Math.abs(list_2.get(0).num - preNum);
preNum = list_2.get(0).num;
finishedList.add(list_2.get(0));
list_2.remove(list_2.get(0));
}
double sum = 0;
for (int i = 0; i < finishedList.size(); i++) {
sum += finishedList.get(i).distance;
}
averDistance = sum / finishedList.size();
}
// 磁道号从小到大排序
public static void numSort_1(ArrayList<Track> list) {
for (int i = 0; i < list.size() - 1; i++)
for (int j = i + 1; j < list.size(); j++) {
if (list.get(i).num > list.get(j).num) {
Track t = list.get(i);
list.set(i, list.get(j));
list.set(j, t);
}
}
}
// 磁道号 从大到小排序
public static void numSort_2(ArrayList<Track> list) {
for (int i = 0; i < list.size() - 1; i++)
for (int j = i + 1; j < list.size(); j++) {
if (list.get(i).num < list.get(j).num) {
Track t = list.get(i);
list.set(i, list.get(j));
list.set(j, t);
}
}
}
}
//磁道类
class Track {
int num;//磁道号
int distance;//磁道移动距离
Track(int num) {
this.num = num;
}
}
Design.java
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextArea;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JRadioButton;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.awt.event.ActionEvent;
import java.awt.Color;
import javax.swing.UIManager;
public class Design extends JFrame {
private int[] queue = new int[10]; //数组-队列
private int startNum;
private JPanel contentPane; //窗体
private JLabel lblStartTrack; //显示文本
private JLabel lblQueue;
private JLabel lblNextTrack;
private JLabel lblDistance;
private JLabel lblSelect;
private JLabel lblAverDistance;
private JTextArea taStartTrack; //文本框
private JTextArea taQueue;
private JTextArea taNextTrack;
private JTextArea taDistance;
private JTextArea taAverDistance;
private JButton btnReset; //按钮
private JButton btnRandom;
private JButton btnQuit;
private JButton btnCommit;
private JRadioButton rdbtnFCFS; //先来先服务算法
private JRadioButton rdbtnSSTF; //最短寻道时间优先算法
private JRadioButton rdbtnSCAN_1; //扫描(自里向外)
private JRadioButton rdbtnCSCAN_1; //循环扫描(自里向外)
private JRadioButton rdbtnSCAN_2; //扫描(自外向里)
private JRadioButton rdbtnCSCAN_2; //循环扫描(自外向里)
private ButtonGroup gb; //按钮组
private ImageIcon icon; //背景图片
private JLabel lblBackground; //将背景图片添加到布局
public Design() {
setTitle("磁盘调度");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //单击窗口的关闭按钮时执行的操作
setBounds(500, 50, 410, 650); //窗口初始位置
contentPane = new JPanel();
setContentPane(contentPane);
contentPane.setLayout(null); //no flowLayout
contentPane.setOpaque(false); //set control no lucency
lblStartTrack = new JLabel("开始磁道号:");
lblStartTrack.setBounds(33, 10, 70, 21);
contentPane.add(lblStartTrack);
lblQueue = new JLabel("请求队列");
lblQueue.setBounds(33, 29, 66, 21);
contentPane.add(lblQueue);
lblNextTrack = new JLabel("被访问的下一磁道号");
lblNextTrack.setBounds(143, 32, 130, 15);
contentPane.add(lblNextTrack);
lblDistance = new JLabel("移动距离");
lblDistance.setBounds(304, 32, 54, 15);
contentPane.add(lblDistance);
lblSelect = new JLabel("请选择一种算法:");
lblSelect.setBounds(10, 311, 121, 21);
contentPane.add(lblSelect);
lblAverDistance = new JLabel("平均寻道长度:");
lblAverDistance.setBounds(164, 10, 86, 21);
contentPane.add(lblAverDistance);
taStartTrack = new JTextArea();
taStartTrack.setBounds(106, 10, 48, 20);
taStartTrack.setBackground(Color.lightGray);
taStartTrack.setEditable(false);
contentPane.add(taStartTrack);
taQueue = new JTextArea();
taQueue.setBounds(47, 60, 39, 184);
taQueue.setBackground(Color.LIGHT_GRAY);
taQueue.setEditable(false);
contentPane.add(taQueue);
taNextTrack = new JTextArea();
taNextTrack.setBounds(181, 57, 55, 184);
taNextTrack.setBackground(Color.LIGHT_GRAY);
taNextTrack.setEditable(false);
contentPane.add(taNextTrack);
taDistance = new JTextArea();
taDistance.setBounds(314, 57, 39, 184);
taDistance.setBackground(Color.LIGHT_GRAY);
taDistance.setEditable(false);
contentPane.add(taDistance);
taAverDistance = new JTextArea();
taAverDistance.setBounds(253, 10, 130, 21);
taAverDistance.setBackground(Color.lightGray);
taAverDistance.setEditable(false);
contentPane.add(taAverDistance);
btnReset = new JButton("重置");
btnReset.addActionListener(new ActionListener() { //点击事件
public void actionPerformed(ActionEvent e) {
taStartTrack.setText(null);
taAverDistance.setText(null);
taQueue.setText(null);
taNextTrack.setText(null);
taDistance.setText(null);
btnCommit.setEnabled(false);
}
});
btnReset.setBounds(10, 278, 93, 23);
contentPane.add(btnReset);
btnRandom = new JButton("随机初始化");
btnRandom.addActionListener(new ActionListener() { //点击事件,添加数据
public void actionPerformed(ActionEvent e) {
taStartTrack.setText(null);
taAverDistance.setText(null);
taQueue.setText(null);
taNextTrack.setText(null);
taDistance.setText(null);
btnCommit.setEnabled(true);
for (int i = 0; i < 10; i++) { //入栈,且无重复
queue[i] = (int) (Math.random() * 100);
for (int j = 0; j < i; j++) {
while (queue[i] == queue[j]) {
queue[i] = (int) (Math.random() * 100);
}
}
}
startNum = (int)(Math.random() * 100);
for (int k = 0; k < 10; k++) {
while (startNum == queue[k]) {
startNum = (int) (Math.random() * 100);
}
}
taStartTrack.append(String.valueOf(startNum));
for (int h = 0; h < 10; h++) {
taQueue.append(String.valueOf(queue[h]) + "\n");
}
}
});
btnRandom.setBounds(134, 278, 121, 23);
contentPane.add(btnRandom);
btnQuit = new JButton("退出");
btnQuit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
System.exit(0);
}
});
btnQuit.setBounds(290, 278, 93, 23);
contentPane.add(btnQuit);
rdbtnFCFS = new JRadioButton("先来先服务");
rdbtnFCFS.setBounds(33, 338, 121, 23);
rdbtnFCFS.setOpaque(false);
contentPane.add(rdbtnFCFS);
rdbtnSSTF = new JRadioButton("最短寻道时间优先");
rdbtnSSTF.setBounds(208, 338, 150, 23);
rdbtnSSTF.setOpaque(false);
contentPane.add(rdbtnSSTF);
rdbtnSCAN_1 = new JRadioButton("扫描(自里向外)");
rdbtnSCAN_1.setBounds(33, 365, 132, 23);
rdbtnSCAN_1.setOpaque(false);
contentPane.add(rdbtnSCAN_1);
rdbtnCSCAN_1 = new JRadioButton("循环扫描(自里向外)");
rdbtnCSCAN_1.setBounds(208, 365, 159, 23);
rdbtnCSCAN_1.setOpaque(false);
contentPane.add(rdbtnCSCAN_1);
rdbtnSCAN_2 = new JRadioButton("扫描(自外向里)");
rdbtnSCAN_2.setBounds(33, 393, 132, 23);
rdbtnSCAN_2.setOpaque(false);
contentPane.add(rdbtnSCAN_2);
rdbtnCSCAN_2 = new JRadioButton("循环扫描(自外向里)");
rdbtnCSCAN_2.setBounds(210, 393, 173, 23);
rdbtnCSCAN_2.setOpaque(false);
contentPane.add(rdbtnCSCAN_2);
gb = new ButtonGroup();
gb.add(rdbtnFCFS);
gb.add(rdbtnSSTF);
gb.add(rdbtnSCAN_1);
gb.add(rdbtnCSCAN_1);
gb.add(rdbtnSCAN_2);
gb.add(rdbtnCSCAN_2);
btnCommit = new JButton("确定");
btnCommit.setEnabled(false);
btnCommit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (!rdbtnFCFS.isSelected() && !rdbtnSSTF.isSelected() && !rdbtnSCAN_1.isSelected()
&& !rdbtnCSCAN_1.isSelected() && !rdbtnSCAN_2.isSelected() && !rdbtnCSCAN_2.isSelected()) {
JOptionPane.showMessageDialog(btnRandom, "请选择一种算法!","提示",JOptionPane.ERROR_MESSAGE);
} else {
taNextTrack.setText(null);
taDistance.setText(null);
taAverDistance.setText(null);
while (Algorithm.finishedList.isEmpty() == false) {
Algorithm.finishedList.remove(0);
}
ArrayList<Track> list = new ArrayList<Track>();
for (int i = 0; i < 10; i++) {
list.add(new Track(queue[i]));
}
if (rdbtnFCFS.isSelected()) {
Algorithm.fcfs(list, startNum);
} else if (rdbtnSSTF.isSelected()) {
Algorithm.sstf(list, startNum);
} else if (rdbtnSCAN_1.isSelected()) {
Algorithm.scan_1(list, startNum);
} else if (rdbtnCSCAN_1.isSelected()) {
Algorithm.cscan_1(list, startNum);
} else if (rdbtnSCAN_2.isSelected()) {
Algorithm.scan_2(list, startNum);
} else if (rdbtnCSCAN_2.isSelected()) {
Algorithm.cscan_2(list, startNum);
}
for (int j = 0; j < 10; j++) {
taNextTrack.append(Algorithm.finishedList.get(j).num + "\n");
taDistance.append(Algorithm.finishedList.get(j).distance + "\n");
}
taAverDistance.append(Algorithm.averDistance + "");
}
}
});
btnCommit.setBounds(143, 433, 93, 23);
contentPane.add(btnCommit);
icon = new ImageIcon("background.jpg");
lblBackground = new JLabel(icon);
lblBackground.setBounds(0, 0, icon.getIconWidth(), icon.getIconHeight());
contentPane.add(lblBackground);
}
}