用Java语言写一个程序,最短进程优先(sjf) 程序要求: 能正常运行,输入进程名称,到达时间,和运行时间,输出平均周转时间,输出调度顺序 额外要求:拥有图形界面,使用持久化数据保存,完成抢占式调度
时间: 2024-10-15 15:11:55 浏览: 4
在Java中实现一个具备图形用户界面、持久化数据存储以及抢占式调度功能的最短进程优先(SJF)调度程序,可以使用Swing库构建GUI,并利用java.util.PriorityQueue来管理就绪队列。这里是一个简化版的示例代码:
```java
import javax.swing.*;
import java.awt.*;
import java.util.*;
class Process {
int pid;
int arrivalTime;
int burstTime;
long completionTime;
Process(int pid, int arrivalTime, int burstTime) {
this.pid = pid;
this.arrivalTime = arrivalTime;
this.burstTime = burstTime;
}
void execute() {
completionTime = arrivalTime + burstTime;
}
}
public class SJFScheduler extends JFrame implements Runnable {
private PriorityQueue<Process> queue;
private ArrayList<String> schedulingOrder = new ArrayList<>();
private List<Process> persistedProcesses; // 假设已经读取或写入持久化数据的地方
public SJFScheduler() {
// 初始化窗口和组件...
setLayout(new GridLayout(2, 1));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
}
@Override
public void run() {
while (!queue.isEmpty()) {
// 抢占式调度,处理新到达的进程
Process process = peekNextProcess();
if (process != null) {
process.execute();
addSchedulingOrder(process);
updateUI(); // 更新UI显示调度顺序
} else {
try {
Thread.sleep(1); // 等待队列中有新的进程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
private Process peekNextProcess() {
return queue.poll();
}
// 添加调度顺序到GUI并保存到文件或其他持久化位置
private void addSchedulingOrder(Process process) {
schedulingOrder.add(process.toString());
saveToDisk(schedulingOrder); // 假设saveToDisk方法负责持久化
}
// 更新UI方法展示调度顺序
private void updateUI() {
// 更新JList或者其他UI元素展示调度顺序
}
// 假设loadFromDisk方法是从文件加载已保存的进程列表
public void loadProcesses() {
persistedProcesses = loadFromDisk();
queue.addAll(persistedProcesses.stream()
.map(Process::new)
.collect(Collectors.toList()));
}
public static void main(String[] args) {
SJFScheduler scheduler = new SJFScheduler();
scheduler.loadProcesses();
}
}
阅读全文