⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myframe.java

📁 一个java写的模拟操作系统进程调度的程序
💻 JAVA
字号:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.border.EtchedBorder;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
import java.util.Random;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.DefaultListModel;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class MyFrame extends JFrame {
	private JList list_4;
	private JTextField currenttimefield;
	private JTextField runtimefield;
	private JTextField runmemoryfield;
	private JTextField runnamefield;
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JList list_3;
	private JList list_2;
	private JList list_1;
	DefaultListModel model_2 = new DefaultListModel();// 用于反映到后备队列的变化list_2
	DefaultListModel model_1 = new DefaultListModel();// 用于反映到就绪队列的变化list_1
	DefaultListModel model_3 = new DefaultListModel();// 用于反映到挂起队列的变化list_3
	DefaultListModel model_4 = new DefaultListModel();// 用于反映到挂起队列的变化list_4
	final JButton runButton = new JButton();
	int timeslice = 10;// 时间片
	int memory = 256;// 总内存
	int systemmemory = 30;// 系统内存
	int availablememory = memory - systemmemory;// 可供分配的内存
	Vector<PCB> reserve = new Vector<PCB>();// 就绪队列
	Vector<PCB> suspend = new Vector<PCB>();// 挂起队列
	Vector<PCB> ready = new Vector<PCB>();// 后备队列

	public MyFrame() {
		super();
		setTitle("时间片轮转演示");
		getContentPane().setLayout(null);
		this.setVisible(true);
		final JScrollPane scrollPane_1 = new JScrollPane();
		scrollPane_1.setBounds(77, 10, 100, 161);
		getContentPane().add(scrollPane_1);

		list_1 = new JList();
		scrollPane_1.setViewportView(list_1);
		list_1.setBorder(new TitledBorder(null, "就绪队列", TitledBorder.CENTER,
				TitledBorder.DEFAULT_POSITION, null, null));

		final JScrollPane scrollPane_2 = new JScrollPane();
		scrollPane_2.setBounds(197, 10, 100, 161);
		getContentPane().add(scrollPane_2);

		list_2 = new JList();
		scrollPane_2.setViewportView(list_2);
		list_2.setBorder(new TitledBorder(null, "后备队列", TitledBorder.CENTER,
				TitledBorder.DEFAULT_POSITION, null, null));

		list_2.addMouseListener(new SuretoSuspend());

		final JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);

		final JMenu menu = new JMenu();
		menu.setText("操作");
		menuBar.add(menu);

		final JMenuItem newItemMenuItem = new JMenuItem();
		newItemMenuItem.addActionListener(new SystemSet());

		newItemMenuItem.setText("设置");
		menu.add(newItemMenuItem);

		final JMenuItem newItemMenuItem_1 = new JMenuItem();
		newItemMenuItem_1.addActionListener(new Addprocess());
		newItemMenuItem_1.setText("添加");
		menu.add(newItemMenuItem_1);
		this.setBounds(250, 200, 526, 421);
		this.addWindowListener(new WindowAdapter() {
			public void windowClosed(WindowEvent e) {
				dispose();
				System.exit(0);
			}
		});

		// final JButton runButton = new JButton();
		runButton.addActionListener(new Running());
		runButton.setVisible(false);
		runButton.setText("Run");
		runButton.setBounds(433, 10, 63, 28);
		getContentPane().add(runButton);

		final JScrollPane scrollPane_3 = new JScrollPane();
		scrollPane_3.setBounds(314, 10, 100, 161);
		getContentPane().add(scrollPane_3);

		list_3 = new JList();
		list_3.setBorder(new TitledBorder(null, "挂起队列", TitledBorder.CENTER,
				TitledBorder.DEFAULT_POSITION, null, null));
		scrollPane_3.setViewportView(list_3);
		list_3.addMouseListener(new SuspendtoReserve());

		final JPanel panel = new JPanel();
		panel.setLayout(null);
		panel.setBorder(new TitledBorder(null, "Running Process",
				TitledBorder.DEFAULT_JUSTIFICATION,
				TitledBorder.DEFAULT_POSITION, null, null));
		panel.setBounds(44, 193, 253, 161);
		getContentPane().add(panel);

		final JLabel nameLabel = new JLabel();
		nameLabel.setText("ProcessName:");
		nameLabel.setBounds(10, 26, 98, 18);
		panel.add(nameLabel);

		runnamefield = new JTextField();
		runnamefield.setBounds(137, 24, 87, 22);
		panel.add(runnamefield);

		final JLabel needmemoryLabel = new JLabel();
		needmemoryLabel.setText("NeedMemory:");
		needmemoryLabel.setBounds(10, 54, 98, 18);
		panel.add(needmemoryLabel);

		final JLabel needtimeLabel = new JLabel();
		needtimeLabel.setText("NeedTime:");
		needtimeLabel.setBounds(10, 90, 98, 18);
		panel.add(needtimeLabel);

		runmemoryfield = new JTextField();
		runmemoryfield.setBounds(137, 52, 87, 22);
		panel.add(runmemoryfield);

		runtimefield = new JTextField();
		runtimefield.setBounds(137, 88, 87, 22);
		panel.add(runtimefield);

		final JLabel runningSecondsLabel = new JLabel();
		runningSecondsLabel.setText("Running seconds:");
		runningSecondsLabel.setBounds(10, 120, 113, 18);
		panel.add(runningSecondsLabel);

		currenttimefield = new JTextField();
		currenttimefield.setBounds(137, 116, 87, 22);
		panel.add(currenttimefield);

		final JScrollPane scrollPane = new JScrollPane();
		scrollPane
				.setBorder(new TitledBorder(null, "完成队列", TitledBorder.CENTER,
						TitledBorder.DEFAULT_POSITION, null, null));
		scrollPane.setBounds(314, 193, 100, 161);
		getContentPane().add(scrollPane);

		list_4 = new JList();
		list_4.setBorder(new LineBorder(Color.LIGHT_GRAY, 1, false));
		scrollPane.setViewportView(list_4);
	}

	class SuretoSuspend extends MouseAdapter {// reserve to suspend
		public void mouseClicked(MouseEvent e) {
			if (e.getClickCount() == 2) {
				int index = list_2.locationToIndex(e.getPoint());
				suspend.add(reserve.get(index));
				model_3.addElement(reserve.get(index).getname());
				list_3.setModel(model_3);
				model_2.remove(index);
				reserve.remove(index);
			}
		}
	}

	class SuspendtoReserve extends MouseAdapter {// suspend to reserve
		public void mouseClicked(MouseEvent e) {
			if (e.getClickCount() == 2) {
				int index = list_3.locationToIndex(e.getPoint());
				reserve.add(suspend.get(index));
				model_2.addElement(suspend.get(index).getname());
				model_3.remove(index);
				suspend.remove(index);
			}
		}
	}

	class MyThread extends Thread {
		public void run() {
			runButton.setVisible(false);
			while (!reserve.isEmpty()
					&& availablememory >= reserve.firstElement()
							.getneedmemory()) {
				ready.add(reserve.firstElement());
				availablememory = availablememory
						- reserve.firstElement().getneedmemory();
				reserve.remove(0);
				model_2.remove(0);
				// list_2.setModel(model_2);
				model_1.addElement(ready.lastElement().getname());
				list_1.setModel(model_1);
			}
			// 写好此方法,就成功
			// -----调度运行-----------------------------
			/*---------abc*/
			while (!ready.isEmpty()) {
				for (int i = 0; i < ready.size(); i++) {
					// System.out.println("Running process:
					// "+ready.get(i).toString());
					runnamefield.setText(ready.get(i).getname());
					runmemoryfield.setText("" + ready.get(i).getneedmemory());
					runtimefield.setText("" + ready.get(i).getneedtime());
					for (int j = 1; j <= timeslice; j++) {
						// System.out.println("Running "+j+" seconds");
						currenttimefield.setText("" + j);
						int temptime = ready.get(i).getneedtime();
						temptime--;
						ready.get(i).setneedtime(temptime);
						if (ready.get(i).getneedtime() == 0) {
							// System.out.println("Done!!!");
							availablememory = availablememory
									+ ready.get(i).getneedmemory();//释放内存
							model_4.addElement(ready.get(i).getname());// 加入完成队列
							list_4.setModel(model_4);
							ready.remove(i);// 从就绪队列中删除此进程
							model_1.remove(i);
							list_1.setModel(model_2);
							i++;// 调整下一个运行的进程
							break;
						}
						try {// 小暂停1s,代表运行1s
							sleep(1000);
						} catch (InterruptedException ie) {
						}
					}// for(j) cycle
					while (!reserve.isEmpty()
							&& availablememory >= reserve.firstElement()
									.getneedmemory()) {
						ready.add(reserve.firstElement());
						availablememory = availablememory
								-reserve.firstElement().getneedmemory();
						reserve.remove(0);
						model_2.remove(0);
						list_2.setModel(model_2);
						model_1.addElement(ready.lastElement().getname());
						list_1.setModel(model_1);
					}
				}// for(i) cycle
			}// while()
			runButton.setVisible(true);
			// --------------------------------------
			/*
			 */// ------abc
		}
	}

	// 此类用于系统设置

	class SetFrame extends JFrame {
		private JTextField textField_2;
		private JTextField textField_1;
		private JTextField textField;

		public SetFrame() {
			super();
			setSize(new Dimension(350, 250));
			setTitle("设置参数");
			this.setVisible(true);
			final JPanel panel = new JPanel();
			panel.setLayout(null);
			getContentPane().add(panel, BorderLayout.CENTER);

			final JLabel label = new JLabel();
			label.setText("时间片:");
			label.setBounds(55, 40, 75, 27);
			panel.add(label);

			textField = new JTextField();
			textField.setText("10");
			textField.setBounds(136, 40, 103, 27);
			panel.add(textField);

			final JLabel label_1 = new JLabel();
			label_1.setText("内存大小:");
			label_1.setBounds(55, 89, 75, 27);
			panel.add(label_1);

			textField_1 = new JTextField();
			textField_1.setText("256");
			textField_1.setBounds(136, 89, 103, 27);
			panel.add(textField_1);

			final JButton button = new JButton();
			button.addActionListener(new SuretoSet());
			button.setText("确定");
			button.setBounds(267, 79, 65, 28);
			panel.add(button);

			final JLabel label_2 = new JLabel();
			label_2.setText("系统内存:");
			label_2.setBounds(55, 132, 66, 27);
			panel.add(label_2);

			textField_2 = new JTextField();
			textField_2.setText("30");
			textField_2.setBounds(136, 132, 103, 27);
			panel.add(textField_2);
		}

		// 此类用于确认设置
		class SuretoSet implements ActionListener {
			public void actionPerformed(final ActionEvent e) {
				int time = Integer.parseInt(textField.getText().trim());
				int memorysize = Integer.parseInt(textField_1.getText().trim());
				int osmemory = Integer.parseInt(textField_2.getText().trim());
				timeslice = time;
				memory = memorysize;
				systemmemory = osmemory;
				availablememory = memory - systemmemory;
				dispose();
			}
		}

	}

	// 此类用于添加进程
	class AddFrame extends JFrame {
		private JTextField needmemoryfield;
		private JTextField needtimefield;
		private JTextField namefield;
		private int countproc = 1;// 对进程依次命名
		private Random ran = new Random();

		public AddFrame() {
			super();
			this.setVisible(true);
			this.setTitle("添加进程");
			getContentPane().setLayout(null);
			setSize(new Dimension(350, 300));

			final JLabel label = new JLabel();
			label.setText("进程名:");
			label.setBounds(80, 37, 66, 18);
			getContentPane().add(label);

			namefield = new JTextField();
			namefield.setBounds(170, 35, 87, 22);
			namefield.setText("Process_" + countproc);
			getContentPane().add(namefield);

			final JLabel label_1 = new JLabel();
			label_1.setText("所需时间:");
			label_1.setBounds(80, 79, 66, 18);
			getContentPane().add(label_1);

			needtimefield = new JTextField();
			needtimefield.setBounds(170, 77, 87, 22);
			needtimefield.setText("" + (ran.nextInt(21) + 10));// 所需时间都在10~30之间的随机数
			getContentPane().add(needtimefield);

			final JLabel label_2 = new JLabel();
			label_2.setText("所需内存:");
			label_2.setBounds(80, 123, 66, 18);
			getContentPane().add(label_2);

			needmemoryfield = new JTextField();
			needmemoryfield.setBounds(170, 121, 87, 22);
			needmemoryfield.setText("" + (ran.nextInt(29) + 1));// 所需内存都在1~30
			getContentPane().add(needmemoryfield);

			final JButton button = new JButton();
			button.addActionListener(new SuretoAdd());
			button.setText("添加");
			button.setBounds(70, 175, 87, 28);
			getContentPane().add(button);

			final JButton button_1 = new JButton();
			button_1.addActionListener(new ActionListener() {
				public void actionPerformed(final ActionEvent arg0) {
					dispose();
				}
			});
			button_1.setText("结束");
			button_1.setBounds(186, 175, 80, 28);
			getContentPane().add(button_1);
		}

		class SuretoAdd implements ActionListener {
			public void actionPerformed(final ActionEvent e) {
				PCB temp = new PCB();
				temp.setname(namefield.getText());
				temp.setneedtime(Integer.parseInt(needtimefield.getText()
						.trim()));
				temp.setneedmemory(Integer.parseInt(needmemoryfield.getText()
						.trim()));
				reserve.add(temp);// 将其加入到后备队列
				runButton.setVisible(true);// 运行按钮为可见
				// 动作反映到图形界面-------
				model_2.addElement(reserve.lastElement().getname());
				list_2.setModel(model_2);
				// ---------------------
				countproc++;
				namefield.setText("Process_" + countproc);
				needtimefield.setText("" + (ran.nextInt(21) + 10));
				needmemoryfield.setText("" + (ran.nextInt(29) + 1));
			}
		}
	}

	class SystemSet implements ActionListener {
		public void actionPerformed(final ActionEvent arg0) {
			new SetFrame();
		}
	}

	class Addprocess implements ActionListener {
		public void actionPerformed(final ActionEvent arg0) {
			new AddFrame();
		}
	}

	class Running implements ActionListener {// 运行命令
		public void actionPerformed(final ActionEvent arg0) {
			// runButton.setVisible(false);
			// running();
			new MyThread().start();
			// runButton.setVisible(true);
		}
	}

	public static void main(String[] args) {
		new MyFrame();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -