📄 os.java
字号:
import java.awt.*;
import java.awt.List;
import java.awt.event.*;
import java.io.DataInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.*;
import java.io.*;
import java.util.*;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class os extends JFrame {
private static int DELAY = 100;
int maxmem=100;//最大内存
int memvalue=0;
int runtime=1;
boolean flag = true;
int omgtime=0;
JProgressBar aJProgressBar = new JProgressBar(0, 10);//进度条类哦
List Lready;
List Lwaiting;
List Lsuspend;
List L_cpus_info, L_memory_table, L_memory_gra;
JButton BCpuscheduler,BRestore, Bgetp_r, BgetP_s, Bgetp_s_r,random;
JTextField tp_name, tp_time, tp_priority, tp_memory_size;
JTextField tcpuinfo;
JLabel p_name, p_time, p_priority, p_memory_size, r_queue, w_queue, s_queue,
memory_gra, memory_table, cpus_info;
JPanel p1, p2, p3, p4,p5,p6;
PCB FirstPcb = new PCB();
ArrayList<PCB> pcbs = new ArrayList<PCB>();
ArrayList<PCB> Gpcbs = new ArrayList<PCB>();
ArrayList<PCB> Hpcbs = new ArrayList<PCB>();
Timer timer = new Timer();
void sort(ArrayList<PCB> pcbs){
for(int i=0;i<pcbs.size()-1;i++){
for(int j = i+1 ; j<pcbs.size();j++){
if(pcbs.get(i).getPriority() >pcbs.get(j).getPriority()){
PCB d = pcbs.get(i);
pcbs.set(i,pcbs.get(j));
pcbs.set(j,d);
}
}
}
}
class MyTask extends java.util.TimerTask{
@Override
public void run() {
int Ftime = 0;
int Fpri = FirstPcb.getPriority()+1;
if (Ftime > 0) {
FirstPcb.setTime(Ftime);
FirstPcb.setPriority(Fpri);
} else {
if(flag){
memvalue = memvalue-FirstPcb.getSize();
FirstPcb.setState("ready");
}
else{
flag = true;
}
pcbs.remove(FirstPcb);// 不能用remove(j) 感觉是不能用这个方法移除第一个类
}
if(pcbs.size()>0){
tcpuinfo.setText(" 调度成功!");
}
else{
tcpuinfo.setText(" 无进程在就绪队列中 !");
}
BCpuscheduler.setEnabled(true);
BgetP_s.setEnabled(true);
Bgetp_s_r.setEnabled(true);
repaint();
}
}
// Panel a = new Panel();
// Panel b = new Panel();
public static void main(String[] args) {
new os().View();
// new ChatClient().reView();
// new ChatClient().information();
}
void View() {
aJProgressBar.setStringPainted(true); // 显示百分比字符
aJProgressBar.setIndeterminate(false); // 不确定的进度条
this.setSize(800, 600);
this.setLocation(100, 100);
this.setLayout(null);
this.setBackground(Color.pink);
this.setLayout(null/*new GridLayout(2, 1, 0, 200)*/);
p_name = new JLabel("进程名");// 第一行,输入进程信息面板;
tp_name = new JTextField(10);
p_time = new JLabel("运行时间(s)");
tp_time = new JTextField(10);
p_priority = new JLabel("优先权");
tp_priority = new JTextField(10);
p_memory_size = new JLabel("所需主存大小(MB)");
tp_memory_size = new JTextField(15);
Bgetp_r = new JButton("置入就绪队列");
BRestore = new JButton("置入后备队列");
random = new JButton("随机产生就绪队列");
p1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
p1.setBounds(0, 0, 800, 60);
p1.add(p_name);
p1.add(tp_name);
p1.add(p_time);
p1.add(tp_time);
p1.add(p_priority);
p1.add(tp_priority);
p1.add(p_memory_size);
p1.add(tp_memory_size);
p1.add(Bgetp_r);
p1.add(BRestore);
p1.add(random);
r_queue = new JLabel("就绪队列");// 第二行,队列名面板;
w_queue = new JLabel("后备队列");
s_queue = new JLabel("挂起队列");
memory_gra = new JLabel("内存状态图");
p2 = new JPanel(new FlowLayout(FlowLayout.CENTER, 130, 10));
p2.setBounds(0, 70, 800, 70);
p2.add(r_queue);
p2.add(w_queue);
p2.add(s_queue);
p2.add(memory_gra);
p2.add(aJProgressBar);
Lready = new List(5);
// 第三行,队列状态面板;
//Lready.setSize(200, 40);
Lwaiting = new List(5);
// Lwaiting.setSize(200, 40);
Lsuspend = new List(5);
// Lsuspend.setSize(200, 40);
L_memory_gra = new List(5);
p3 = new JPanel(new GridLayout(1,4 ,0, 0));
p3.setBounds(0, 400, 800, 100);
p3.add(Lready);
p3.add(Lwaiting);
p3.add(Lsuspend);
//p3.add(L_memory_gra);
BCpuscheduler = new JButton("进行调度");// 第四行,调度面板;
BgetP_s = new JButton("挂起");
Bgetp_s_r = new JButton("解挂");
tcpuinfo = new JTextField("info", 30);
p4 = new JPanel(new FlowLayout(FlowLayout.CENTER, 30, 0));
p4.setBounds(0, 520, 800, 70);
p4.add(BCpuscheduler);
p4.add(BgetP_s);
p4.add(Bgetp_s_r);
p4.add(tcpuinfo);
//p5 = new JPanel(new GridLayout(2,1 ,0, 0));
//p6 = new JPanel(new GridLayout(2,1 ,0, 20));
//p5.add(p1);
//p5.add(p2);
//p6.add(p3);
this.add(p4);
this.add(p1);
this.add(p2);
this.add(p3);
//this.add(p5);// 窗口面板;
//this.add(p6);
this.setVisible(true);
this.setResizable(false);
this.addWindowListener(new MyWindowMonitor());
BgetLis b1 = new BgetLis();
BCpuLis b2 = new BCpuLis();
BgetP_sLis b3=new BgetP_sLis();
Bgetp_s_rLis b4=new Bgetp_s_rLis();
BRestoreLis b5=new BRestoreLis();
randomLis b6=new randomLis();
Bgetp_r.addActionListener(b1);
BCpuscheduler.addActionListener(b2);
BgetP_s.addActionListener(b3);
Bgetp_s_r.addActionListener(b4);
BRestore.addActionListener(b5);
random.addActionListener(b6);
}
class BarThread extends Thread {
JProgressBar progressBar;
public BarThread(JProgressBar bar) {
progressBar = bar;
}
public void run() {
int minimum = progressBar.getMinimum();
int maximum = progressBar.getMaximum();
Runnable runner = new Runnable() {
public void run() {
int value = progressBar.getValue();
progressBar.setValue(value + 1);
}
};
for (int i = minimum; i < maximum; i++) {
if(flag){
omgtime = i;
}
try {
SwingUtilities.invokeAndWait(runner); // Our task for each step is to just sleep
Thread.sleep(DELAY);
} catch (InterruptedException ignoredException) {
} catch (InvocationTargetException ignoredException) {
}
}
}
}
class MyWindowMonitor extends WindowAdapter {
public void windowClosing(WindowEvent e) {
setVisible(false);
// notconnect();
System.exit(0);
}
}
class BgetLis implements ActionListener {
@SuppressWarnings("deprecation")
public void actionPerformed(ActionEvent e) {
try {
String name1 = tp_name.getText();
int time1 = Integer.parseInt(tp_time.getText());
int pri1 = Integer.parseInt(tp_priority.getText());
String state1 = "ready";
int mem=Integer.parseInt(tp_memory_size.getText());
if((memvalue+mem)>maxmem){
tcpuinfo.setText(" 内存溢出!");
repaint();
}
else{
if (tp_name.getText().equalsIgnoreCase("")) {
}// NAME输入不能为空
else {
memvalue=memvalue+mem;
System.out.println(name1);
Lready.removeAll();
PCB rrpcb = new PCB(name1, time1, pri1, state1,mem);
tp_name.setText("");
tp_priority.setText("");
tp_time.setText("");
tp_memory_size.setText("");
pcbs.add(rrpcb);
tcpuinfo.setText("置入就绪队列成功!");
sort(pcbs);
repaint();
}
}
} catch (Exception e1) {
}
}
}
class BCpuLis implements ActionListener {
public void actionPerformed(ActionEvent e) {
if(pcbs.size()<5){
if(Hpcbs.size()>0){
int mem=0;
while((Hpcbs.size())>0&&((memvalue+mem)<maxmem)&&pcbs.size()<5){
mem=Hpcbs.get(0).getSize();
if((memvalue+mem)>maxmem){
tcpuinfo.setText(" 内存溢出!");
}
else{
memvalue=memvalue+mem;
Hpcbs.get(0).setState("ready");
pcbs.add(Hpcbs.get(0));
Hpcbs.remove(0);
}
}
}
}
int j = 40000, k;
for (int i = 0; i < pcbs.size(); i++) {
k = pcbs.get(i).getPriority();
if (j > k) {
FirstPcb = pcbs.get(i);
j = k;
}
}
if(pcbs.size()>0){
timer.schedule(new MyTask(), FirstPcb.getTime()*1000);
}
//在1秒后执行此任务,每次间隔2秒,假如传递一个Data参数,就可以在某个固定的时间执行这个任务.
BCpuscheduler.setEnabled(false);
//BgetP_s.setEnabled(false);
//Bgetp_s_r.setEnabled(false);
if(pcbs.size()>0){
DELAY= 100* FirstPcb.getTime();
aJProgressBar.setValue(0);
Thread stepper = new BarThread(aJProgressBar);
stepper.start();
aJProgressBar.setValue(0);
Lwaiting.removeAll();
}
FirstPcb.setState("running");
sort(pcbs);
repaint();
}
}
class BgetP_sLis implements ActionListener{
public void actionPerformed(ActionEvent e) {
flag = false;
System.out.println("omgtime="+omgtime);
try {
int Gua=Lready.getSelectedIndex();
PCB GuaPcb=new PCB();
GuaPcb=pcbs.get(Gua);
int time = (int) (GuaPcb.getTime()*0.1*omgtime);
GuaPcb.setTime(GuaPcb.getTime()-time);
pcbs.remove(GuaPcb);
GuaPcb.setState("waiting");
Gpcbs.add(GuaPcb);
memvalue = memvalue-GuaPcb.getSize();
//aJProgressBar.setValue(0);
repaint();
tcpuinfo.setText(" 挂起成功!"); //里面执行的工程只有将就绪队列选中的进程去到 然后添加到挂起中 内存也释放
}catch (Exception e1) {
}
}
}
class Bgetp_s_rLis implements ActionListener{
public void actionPerformed(ActionEvent e) {
try {
int JGua=Lsuspend.getSelectedIndex();
PCB JGuaPcb=new PCB();
JGuaPcb=Gpcbs.get(JGua);
Gpcbs.remove(JGuaPcb);
JGuaPcb.setState("ready");
pcbs.add(JGuaPcb);
Lready.removeAll();
sort(pcbs);
repaint();
tcpuinfo.setText(" 解挂成功!");
memvalue = memvalue+JGuaPcb.getSize();
}catch (Exception e1) {
}
}
}
class BRestoreLis implements ActionListener{
@SuppressWarnings("deprecation")
public void actionPerformed(ActionEvent e) {
try {
String name1 = tp_name.getText();
int time1 = Integer.parseInt(tp_time.getText());
int pri1 = Integer.parseInt(tp_priority.getText());
String state1 = "Restore";
int mem=Integer.parseInt(tp_memory_size.getText());
if(mem>maxmem){
tcpuinfo.setText(" 内存过大,错误进程!");
return;
}
if ((tp_name.getText().equalsIgnoreCase(""))) {
}// NAME输入不能为空
else {
System.out.println(name1);
Lwaiting.removeAll();
PCB rrpcb = new PCB(name1, time1, pri1, state1,mem);
tp_name.setText("");
tp_priority.setText("");
tp_time.setText("");
tp_memory_size.setText("");
Hpcbs.add(rrpcb);
tcpuinfo.setText("置入后备队列成功!");
repaint();
}
} catch (Exception e1) {
}
}
}
class randomLis implements ActionListener{ // 随机按钮监听
@SuppressWarnings("deprecation")
public void actionPerformed(ActionEvent e) {
if(pcbs.size()<=0){
for(int i=1;i<6;i++){
String name = "pro"+i;
int timenum = (int) (Math.random()*10)+1;
int prinum = (int) (Math.random()*19)+1;
int memnum = (int) (Math.random()*10)+1; //为1~20的随机数
String state="ready";
PCB pcb = new PCB(name,timenum,prinum,state,memnum);
memvalue = memvalue+memnum;
pcbs.add(pcb);
}
sort(pcbs);
repaint();
}
}
}
public void paint(Graphics g){
Color c =g.getColor();
Color c1= new Color(0,0,0);
g.setColor(c1);
g.fillRoundRect(165,250-60,400,20,5,5);
g.fillRoundRect(165,300-80,400,20,5,5);
g.fillRoundRect(165,220-60,400,20,5,5);
g.fillRoundRect(640,220-60,100,20,5,5);
g.fillRoundRect(100, 300-80, 60, 20, 5, 5);
g.fillRoundRect(100, 250-60, 60, 20, 5, 5);
g.fillRoundRect(100, 220-60, 60, 20, 5, 5);
g.setColor(Color.orange);
g.drawString("后备队列", 100, 315-80);
g.drawString("就绪队列", 100, 265-60);
g.drawString("CPU", 100, 235-60);
g.setColor(Color.BLUE);
g.fillRoundRect(640,220-60,memvalue,20,5,5);
g.setColor(Color.orange);
g.drawString(memvalue+"%", 680, 235-60);
for(int i=0;i<pcbs.size();i++){
PCB pro = new PCB();
pro = pcbs.get(i);
if(pro.getState().equalsIgnoreCase("ready")){
pro.draw(g, i*50+165, 250-60, 50, 20);
}
else{
pro.draw(g, 165, 220-60, 130, 20);
}
}
for(int i=0;i<Hpcbs.size();i++){
PCB pro = new PCB();
pro = Hpcbs.get(i);
pro.draw(g, i*50+165, 220, 50, 20);
}
Lready.removeAll();
for (int i = 0; i < pcbs.size(); i++) {
PCB rpcb = pcbs.get(i);
String name = rpcb.getName();
int time = rpcb.getTime();
int pri = rpcb.getPriority();
String state=rpcb.getState();
String s = "name=" + name + ",time=" + time + ",Priority="
+ pri+"state=" + state;
System.out.println(s);
Lready.add(s);
if(state.equalsIgnoreCase("running")){
Lready.select(i);
}
}
Lsuspend.removeAll();
for (int i = 0; i < Gpcbs.size(); i++) {
PCB rpcb = Gpcbs.get(i);
String name = rpcb.getName();
int time = rpcb.getTime();
int pri = rpcb.getPriority();
String state=rpcb.getState();
String s = "name=" + name + ",time=" + time + ",Priority="
+ pri+"state=" + state;
System.out.println(s);
Lsuspend.add(s);
}
Lwaiting.removeAll();
for (int i = 0; i < Hpcbs.size(); i++) {
PCB rpcb = Hpcbs.get(i);
String name = rpcb.getName();
int time = rpcb.getTime();
int pri = rpcb.getPriority();
String state=rpcb.getState();
String s = "name=" + name + ",time=" + time + ",Priority="
+ pri+"state=" + state;
System.out.println(s);
Lwaiting.add(s);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -