java操作系统优先级和分时调度算法和内存管理

java操作系统优先级和分时调度算法和内存管理

好了最新的改版出炉,更加的符合用户的胃口,也是本人修改的最终版本。

更新的地方:1.添加了进度条标示了内存的占用情况;2.实现了每一个按钮的快捷键;3.将光标置于PCB的ID处,方便用户直接开始输入数据;4.加上了鼠标直接对队列的操作,比如对就绪队列的进程双击,即可实现挂起功能,更多的按钮解释都在相应的按钮上加了提示;5.关键的系统操作按钮追加了颜色,并且在最后添加了帮助功能;6.优化了界面的大小和边框,使就绪队列的数据居中显示;

 

 

package CPU;

public class ProcessPCB {
//	backupBAK 后备  ready 就绪  suspend 挂起 memory内存
	private String PID;
	private int RequiredTime;
	private int Priority;
	private String Status;
	private int MwmoryBase = 0000;
	private int MemoryLimit;
//	private String PCBPointer;

	public ProcessPCB(String initpID, int initRTime, int initpriority, 
			           String status, int initBase, int initLimit) {
		
		this.PID = initpID;
		this.RequiredTime = initRTime;
		this.Priority = initpriority;
		this.Status = status;
		this.MwmoryBase = initBase;
		this.MemoryLimit = initLimit;
	}
	
	public String getPID() {
		if(this.PID == null)
			return " ";
		else
			return this.PID;
	}
	
	public int getRequiredTime() {
		return this.RequiredTime;
	}

	public int getPriority() {
		return this.Priority;
	}
	
	public String getStatus() {
		if(this.Status == null)
			return " ";
		else
			return this.Status;
	}

	public int getMemoryBase() {
		return this.MwmoryBase;
	}

	public int getMemoryLimit() {
		return this.MemoryLimit;
	}

	public boolean equals(ProcessPCB  pcb) {
		
		if(pcb.getPID() == this.getPID())  {
			return true;
		}
		else return false;
	}
	
	public String toString() {
		return this.getPID() + "_" + this.getRequiredTime() + "_" + this.getPriority() + "_" 
		         + this.getStatus() + "_" + this.getMemoryBase() + "_" + this.getMemoryLimit() + "\n";
	}
	
	public void run() {
		this.RequiredTime = this.RequiredTime-1;
		this.Priority = this.Priority-1;
	}
	
}

 

package CPU;

import java.util.ArrayList;
import java.util.Iterator;

public class PCBRecords implements Iterable<ProcessPCB> {
	
	private ArrayList<ProcessPCB> PCBItems;
	
    public ArrayList<ProcessPCB> getPCBItems() {	
		return this.PCBItems;
	}
    
    public PCBRecords() {
		this.PCBItems = new ArrayList<ProcessPCB>();
	}
    
    public void addItem(ProcessPCB PcbItem) {
		this.PCBItems.add(PcbItem);
	}
    
    public void removeItem(ProcessPCB PCbItem) {	
 		this.PCBItems.remove(PCbItem);
 	}
    
    public ProcessPCB getItem(ProcessPCB processPCB) {	
 		for (ProcessPCB pCbItem : this.PCBItems) {
				  if (pCbItem.equals(processPCB)) {				  	    
				  	    return pCbItem;
				  	}
				}				
			return null;
 	}
 	
    public ProcessPCB getItem(String pid) {	
 		for (ProcessPCB pcBItem : this.PCBItems) {
				  if (pcBItem.getPID().equals(pid)) {				  	    
				  	    return pcBItem;
				  	}
				}				
			return null;
 	}
    
    public int getNumberOfItems() {	
 		return this.PCBItems.size();
 	}

    public String[] getItemsProperties() {	
 		String itemsProperties[] = new String[getNumberOfItems()];
 		
 		int i = 0;
        for(Iterator iterator1 = PCBItems.iterator(); iterator1.hasNext();)
        {
        	ProcessPCB stu_Item = (ProcessPCB)iterator1.next();
        	itemsProperties[i++] = stu_Item.toString();
        }
        return itemsProperties;
 	}

	public Iterator<ProcessPCB> iterator() {
		return this.PCBItems.iterator();
	}
}

 

package CPU;

public class MemoryItem {
	private int memoryBase=0;
	private int memoryLimit=0;
	private int availableStatus=0;
	
	public MemoryItem(int initMemoryBase, int initMemoryLimit) {
		this.memoryBase = initMemoryBase;
		this.memoryLimit = initMemoryLimit;
	}
	
	public int getMemoryBase() {
		return this.memoryBase;
	}
   
    public int getMemoryLimit() {
		return this.memoryLimit;
	}
     
    public int getStatus() {
		return this.availableStatus;
	}
    
    public String toString() {
    	return this.getMemoryBase() + "_" + this.getMemoryLimit() + "\n";
    }
    
}

 

package Final;


import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.StringTokenizer;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JRadioButton;
import javax.swing.JRootPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableCellRenderer;



public class CPUScheduling extends JFrame {
	/**
	 * 定义变量
	 */
	private static final long serialVersionUID = -6748846647033499999L;
	//放歌对象
	private AudioClip clip;
	//内存占用情况
	private static int rate=0;
	private static JProgressBar jpr = new JProgressBar(0,1000);
	static private PrintWriter  stdErr = new  PrintWriter(System.err, true);
	private boolean bflag=false;
	static private int WIDTH = 1000, HEIGHT = 730;            // the size of the Frame 主面板                                       	
	/* 各列表对应的面板规格*/
/*	对应各名词释义  backupBAK 后备  ready 就绪  suspend 挂起  memory内存  */
	static private int BackupBAK_CELL_SIZE = 250, BackupBAK_LIST_ROWS = 10;	//后备队列
	static private int Suspend_CELL_SIZE = 250, Suspend_LIST_ROWS = 10;	    //挂起队列
	static private int Ready_CELL_SIZE = 200, Ready_LIST_ROWS = 6;	        //就绪队列
	static private int Memory_CELL_SIZE = 200, Memory_LIST_ROWS = 4;       //内存队列
	static private int CPU_ROWS =3, CPU_COLS = 2;                         //CPU面板
	static private int STATUS_ROWS = 7, STATUS_COLS = 45;                   //系统状态面板
    private int timeslice = 1;                              //设置时间片大小
    private int systemStatus=0;        //设置系统状态 0——系统预备状态,等待开始,1——系统运行状态,2——系统暂停状态
	static private int TOTAL__TEXTFIELD_SIZE = 10;	    // Size total text field 记录各队列元素个数
	
	private JList backupList, suspendList, readyList, memoryList;  //各队列相对应的数组列表 
     //	进程添加框中的"添加至后备队列","添加至就绪队列","重置"Button
	private JButton addToBAKButton, addToReadyButton, resetButton; 
	   //就绪队列框中的"挂起",挂起队列框中的"解挂","删除"Button
	private JButton suspendButton, umountButton, removeButton;
	       //Status面板中的"启动系统","重置系统"Button,帮助按钮
	private JButton startButton, pauseButton, resetSyatemButton,helpButton;   
	            //优先级和时间片单选钮及时间片显示框
	private JRadioButton priorityJRB, timesliceJRB;
	private JLabel timesliceSizeLabel;    
	private JTextField timesliceJtf;
            //后备面板、进程添加面板、挂起面板、内存面板
	private JPanel backupBAKPanel, PCBItemPanel, suspendedPanel, memoryPanel;
	               //后备队列、挂起队列元素总数标签
	private JLabel backupTotalLabel, suspendTotalLabel;
    //进程信息标签  进程编号PID,所需运行时间requiredTime,优先级priority,当前状态statues,内存中的基址base,所需内存大小limit
	private JLabel PIDLabel, requiredTimeLabel, priorityLabel, statuesLabel, baseLabel, limitLabel;
            //后备队列、挂起队列元素总数文本框(不可编辑)
	private JTextField backupTotalTextField, suspendTotalTextField;
	//进程信息文本框 PID(可编辑),requiredTime(可编辑),priority(可编辑),status(不可编辑),base(不可编辑),limit(可编辑)
	private JTextField PIDTextField, requiredTimeTextField, priorityTextField, statusTextField, baseTextField, limitTextField;
            //CPU状态显示文本域(不可编辑),status信息文本域(用于现实程序每一步的操作和影响,不可编辑)
	private JTextArea CPUTextArea, statuesTextArea;
	//后备队列PCB数组,就绪、挂起,——内存(可分分区表)
	PCBRecords backupPCB, readyPCB, suspendedPCB;
	private MemoryRecords memoryItems;
	private boolean flag = false;
	/**
	 * 主函数
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		new CPUScheduling().initFrame();
	}
	//初始化Frame
	public void initFrame() {
		
		backupList = new JList();
		backupList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		backupList.setVisibleRowCount(BackupBAK_LIST_ROWS);
		backupList.setFixedCellWidth(BackupBAK_CELL_SIZE);		
		suspendList = new JList();
		suspendList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		suspendList.setVisibleRowCount(Suspend_LIST_ROWS);
		suspendList.setFixedCellWidth(Suspend_CELL_SIZE);		
		readyList = new JList();
		readyList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		readyList.setVisibleRowCount(Ready_LIST_ROWS);
		readyList.setFixedCellWidth(Ready_CELL_SIZE);	
		memoryList = new JList();
		memoryList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		memoryList.setVisibleRowCount(Memory_LIST_ROWS);
		memoryList.setFixedCellWidth(Memory_CELL_SIZE);
		
		suspendButton = new JButton("挂起(3)");
		addToBAKButton = new JButton("加入后备(1)");
		addToReadyButton = new JButton("加入就绪(2)");
		resetButton = new JButton("重置(0)");
		umountButton = new JButton("解挂(4)");
		removeButton = new JButton("移除(5)");
		startButton = new JButton("调度开始(Enter)");
		pauseButton = new JButton("暂停(Pause)");
		resetSyatemButton = new JButton("重置系统(Backspace)");
		helpButton = new JButton("帮助(H)");
		priorityJRB = new JRadioButton("优先级(Page Up)", true);
		timesliceJRB = new JRadioButton("时间片(Page Down)");
		
		suspendButton.setToolTipText("双击进程可以直接挂起!");
		umountButton.setToolTipText("双击解挂按钮的正上方的进程,可以直接解挂!");
		removeButton.setToolTipText("双击移除按钮的正上方的进程,可以直接移除!");
		
		startButton.setBackground(Color.GREEN);
		pauseButton.setBackground(new Color(0,150,255));
		resetSyatemButton.setBackground(Color.RED);
		backupTotalLabel = new JLabel("总计:");
		backupTotalTextField = new JTextField("0", TOTAL__TEXTFIELD_SIZE);
		backupTotalTextField.setEditable(false);
		suspendTotalLabel = new JLabel("总计:");
		suspendTotalTextField = new JTextField("0", TOTAL__TEXTFIELD_SIZE);
		suspendTotalTextField.setEditable(false);
		timesliceSizeLabel = new JLabel("时间片:");
		timesliceJtf = new JTextField("3", 5);
		timesliceJtf.setEditable(true);
		
		CPUTextArea = new JTextArea(CPU_ROWS, CPU_COLS);
		CPUTextArea.setEditable(false);
		statuesTextArea = new JTextArea(STATUS_ROWS, STATUS_COLS);
		statuesTextArea.setEditable(false);
		
/* north panel*/
		JPanel northPanel = new JPanel(new GridLayout(1, 3));	
		PCBItemPanel = new JPanel(new FlowLayout());
		PCBItemPanel.setBorder(
				BorderFactory.createTitledBorder("PCB项目信息"));
		JPanel PCBItemButtonJPanel = new JPanel(new GridLayout(1, 3));
		PCBItemButtonJPanel.add(addToBAKButton);
		PCBItemButtonJPanel.add(addToReadyButton);
		PCBItemButtonJPanel.add(resetButton);
		
		PCBItemPanel.add(this.initPCBItemPanel());
		PCBItemPanel.add(PCBItemButtonJPanel);
		
           //backupBAKList Panel 
		backupBAKPanel = new JPanel(new BorderLayout());
		JTable jtb = new JTable(1, 6);
		jtb.setRowHeight(30);
		jtb.setEnabled(false);
		jtb.setGridColor(Color.BLUE);
		//设置jtable中的数据居中显示
		DefaultTableCellRenderer   r   =   new   DefaultTableCellRenderer();   
		r.setHorizontalAlignment(JLabel.CENTER);   
		jtb.setDefaultRenderer(Object.class,r);
		jtb.setFont(new Font("",Font.BOLD,14));
		String[] str ={"name","time","priority","status","base","limit"};
		for(int i = 0;i<6;i++){
			jtb.setValueAt(str[i], 0, i);
		}
		backupBAKPanel.setBorder(BorderFactory.createTitledBorder("后备队列"));
		backupList.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        JPanel backupTotalPAnel = new JPanel();
        backupTotalPAnel.add(backupTotalLabel);
        backupTotalPAnel.add(backupTotalTextField);
        
        backupBAKPanel.add(jtb,BorderLayout.NORTH);
        backupList.setFont(new Font(null, Font.BOLD,18));
        backupBAKPanel.add (
				new JScrollPane(backupList,
						JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
						JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER);
        backupBAKPanel.add(backupTotalPAnel, BorderLayout.SOUTH);
        
           // SuspendList Panel      
        suspendedPanel = new JPanel(new BorderLayout());
        suspendedPanel.setBorder(BorderFactory.createTitledBorder("挂起队列"));
        
        JPanel suspendedTotalPAnel = new JPanel();
        suspendedTotalPAnel.add(suspendTotalLabel);
        suspendedTotalPAnel.add(suspendTotalTextField);
                                              
        JPanel suspendComponentPanel = new JPanel(new GridLayout(1, 2));
        suspendComponentPanel.add(umountButton);
        suspendComponentPanel.add(removeButton);
        
        suspendedPanel.add (suspendedTotalPAnel, BorderLayout.NORTH);
        suspendList.setFont(new Font(null, Font.BOLD,18));
        suspendList.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        suspendedPanel.add (
				new JScrollPane(suspendList,
						JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
						JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER);
        suspendedPanel.add(suspendComponentPanel, BorderLayout.SOUTH);
      
/* center Panel*/  
        JPanel centrelPanel = new JPanel(new GridLayout(1, 3));
            
            // readyList panel
        JPanel readyListPanel = new JPanel(new BorderLayout());
        readyListPanel.setBorder(BorderFactory.createTitledBorder("就绪队列"));
        readyList.setFont(new Font(null, Font.BOLD,18));
        readyList.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        readyListPanel.add (
    			new JScrollPane(readyList,
    					JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
    					JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED));
        readyListPanel.add (suspendButton, BorderLayout.SOUTH);
            // CPU panel
        JPanel CPUPanel = new JPanel(new BorderLayout());
        CPUPanel.setBorder(BorderFactory.createTitledBorder("CPU-运行"));
        JLabel jl=new JLabel(new ImageIcon("2.gif"));
        CPUPanel.add(jl,BorderLayout.CENTER);
        CPUTextArea.setFont(new Font(null, Font.BOLD,18));
        CPUPanel.add (new JScrollPane(CPUTextArea,
    			JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
    			JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED),BorderLayout.NORTH); 
        	
        memoryPanel = new JPanel(new BorderLayout());
        memoryPanel.setBorder(BorderFactory.createTitledBorder("内存列表(正被占用内存——剩余内存)"));
        memoryList.setFont(new Font(null, Font.BOLD,18));
        memoryPanel.add (
    			new JScrollPane(memoryList,
    					JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
    					JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED),BorderLayout.NORTH);
        //加入内存占用的比例条
		jpr.setBackground(Color.WHITE);
		jpr.setForeground(Color.BLUE);
		jpr.setStringPainted(true);
		memoryPanel.add(jpr);
		
        northPanel.add(backupBAKPanel);
        northPanel.add(CPUPanel);
        northPanel.add(memoryPanel);
        centrelPanel.add(readyListPanel);
        centrelPanel.add(suspendedPanel);
        centrelPanel.add(PCBItemPanel);    
/*statues panel*/
        JPanel southPanel = new JPanel(new BorderLayout());
        
        JPanel statuesPanel = new JPanel();
        statuesPanel.setBorder(BorderFactory.createTitledBorder("状态"));
        statuesTextArea.setBackground(Color.YELLOW);
        statuesTextArea.setFont(new Font(null, Font.BOLD,18));
        statuesPanel.add (new JScrollPane(statuesTextArea,
    			JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
    			JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED));
        
        JPanel systemContralButtonPanel = new JPanel(new GridLayout(7, 1));
        systemContralButtonPanel.setBorder(BorderFactory.createTitledBorder("系统控制区"));
        ButtonGroup group = new ButtonGroup();
        group.add(priorityJRB);
        group.add(timesliceJRB);
        JPanel porityPanel = new JPanel(new GridLayout(1, 2));
        porityPanel.add(timesliceSizeLabel);
        porityPanel.add(timesliceJtf);
        systemContralButtonPanel.add(priorityJRB);
        systemContralButtonPanel.add(timesliceJRB);
        systemContralButtonPanel.add(porityPanel);
        systemContralButtonPanel.add(startButton);
        systemContralButtonPanel.add(pauseButton);
        systemContralButtonPanel.add(resetSyatemButton);
        systemContralButtonPanel.add(helpButton);
        
        
        southPanel.add(statuesPanel, BorderLayout.CENTER);
        southPanel.add(systemContralButtonPanel, BorderLayout.EAST);
      
//		 布置界面
		setLayout(new BorderLayout());
		add(northPanel, BorderLayout.NORTH);
		add(centrelPanel, BorderLayout.CENTER);		
		add(southPanel, BorderLayout.SOUTH); 
		addWindowListener(new WindowAdapter(){
		   public void windowClosing(WindowEvent e){
			   int result=JOptionPane.showConfirmDialog(null, "你确定要退出?", "Information", JOptionPane.YES_NO_OPTION);
				 if(result==JOptionPane.YES_NO_OPTION)
					//这里用这个比较合适,因为这样是直接退出程序,而dispose()只关闭窗体,而程序还没结束。
					System.exit(0);
		   }
		});
		//statuesPanel
//		 开始监听按钮
		backupList.addListSelectionListener(new DisplayBackupProcessListener());
		suspendList.addListSelectionListener(new DisplaySuspendedProcessListener());
		readyList.addListSelectionListener(new DisplayreadyProcessListener());
				
		addToBAKButton.addActionListener(new AddToBAKListener());
		addToReadyButton.addActionListener(new AddToReadyListener());
		resetButton.addActionListener(new ResetListener());
		suspendButton.addActionListener(new SuspendListener());
		umountButton.addActionListener(new UmountListener());
		removeButton.addActionListener(new RemoveListener());
		startButton.addActionListener(new StartSystemListener());
		pauseButton.addActionListener(new SystemPauseListener());
		resetSyatemButton.addActionListener(new ResetSystemListener());  
		priorityJRB.addActionListener(new priotiryListener());
		timesliceJRB.addActionListener(new timeslicListener());
		//实现快捷键
		addToBAKButton.setMnemonic(KeyEvent.VK_1);
		addToReadyButton.setMnemonic(KeyEvent.VK_2);
		resetButton.setMnemonic(KeyEvent.VK_0);
		suspendButton.setMnemonic(KeyEvent.VK_3);
		umountButton.setMnemonic(KeyEvent.VK_4);
		removeButton.setMnemonic(KeyEvent.VK_5);
		startButton.setMnemonic(KeyEvent.VK_ENTER);
		pauseButton.setMnemonic(KeyEvent.VK_PAUSE);
		resetSyatemButton.setMnemonic(KeyEvent.VK_BACK_SPACE);
		helpButton.setMnemonic(KeyEvent.VK_H);
		priorityJRB.setMnemonic(KeyEvent.VK_PAGE_UP);
		timesliceJRB.setMnemonic(KeyEvent.VK_PAGE_DOWN);
		
		backupPCB = new PCBRecords();
		readyPCB = new PCBRecords();
		suspendedPCB = new PCBRecords();
		memoryItems = new MemoryRecords();
		MemoryItem initMemoryItem = new MemoryItem(0,1000);
		memoryItems.addItem(initMemoryItem);
		backupList.setListData(backupPCB.getItemsProperties());
		readyList.setListData(readyPCB.getItemsProperties());
		suspendList.setListData(suspendedPCB.getItemsProperties());
		memoryList.setListData(memoryItems.getItemsProperties());
		
		setTitle("CPU调度");
		setLayout(new GridLayout(3,3));
		setIconImage(new ImageIcon("321.jpg").getImage());//添加方框的图标
		setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
		setSize(WIDTH, HEIGHT);
		//设置界面的外观
		setUndecorated(true);
	    getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
	    setLocationRelativeTo(null);
		setResizable(true);
		setVisible(true);
		helpButton.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent e) {
				initHelp();
			}
			//帮助界面
			private void initHelp() {
				JFrame jf = new JFrame();
				jf.setSize(100, 100);
				jf.setResizable(false);
				jf.setLocationRelativeTo(null);
				JButton shiy =new JButton("使用说明");
				JButton guany =new JButton("关于作者");
				jf.setLayout(new GridLayout(2,1));
				jf.add(shiy);
				jf.add(guany);
				jf.setVisible(true);
				shiy.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						JOptionPane.showMessageDialog(null, "使用ALT+相应的按键,可以实现键盘操作!");
					}
				});
				guany.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						JOptionPane.showMessageDialog(null, "Ctong from the class 1307");
					}
				});
			}
		});
		//实现双击挂起
		readyList.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				// TODO Auto-generated method stub
				if(e.getClickCount()==2){
				String selectedReadyItem = null;
				String pid = "";
				if(readyPCB.getNumberOfItems() == 0)
		        {
					statuesTextArea.append("就绪队列为空!\n");
		        } else {
		          	try {
		            	selectedReadyItem = (String) readyList.getSelectedValue();
		                if(selectedReadyItem == null)  {
		                   	statuesTextArea.append("请选择一个进程放入就绪队列!\n");
		                } else
		                   {
		                    	StringTokenizer stringtokenizer = new StringTokenizer(selectedReadyItem, "_");
		            			pid = stringtokenizer.nextToken();
		            			ProcessPCB selectedItem = readyPCB.getItem(pid);
		                    	if(selectedItem == null)  {
		                    		statuesTextArea.append("进程 " + pid + " 不存在!\n");
		    	                }  else  {
		    	                	ProcessPCB boolItem = suspendedPCB.getItem(pid);
		    	                	if(boolItem != null) {
		    	                		statuesTextArea.append("PCB " + pid + " 已经存在于挂起队列!\n"
		       				                 + "你需要去修改所选择的PCB的PID!\n");
		    	                		while(boolItem != null) {
		    		                		pid = "S" + pid;
		    		                		boolItem = suspendedPCB.getItem(pid);
		    		                	}
		    	                	}
		    	                	  //注意下一步存在问题!   	                	
		    	                	ProcessPCB newPcb = new ProcessPCB(pid, selectedItem.getRequiredTime(), 
		    	                			selectedItem.getPriority(),"Suspended", -1, selectedItem.getMemoryLimit());   	                	
		    	                	rate-=selectedItem.getMemoryLimit();
		    	                	jpr.setValue(rate);
		    	                	memoryRecall(selectedItem.getMemoryBase(), selectedItem.getMemoryLimit());
		    	                	
		    	                	suspendedPCB.addItem(newPcb);
		    	                	readyPCB.removeItem(selectedItem);
		    	                	sortReadyPCB(); 
		    	                	suspendList.setListData(suspendedPCB.getItemsProperties());
		    	                    statuesTextArea.append("进程已被挂起!\n");
		    	                    suspendTotalTextField.setText(Integer.toString(suspendedPCB.getNumberOfItems()));
		    	                 }
		                    }  
		            	} catch (RuntimeException e1) {
		    				// TODO Auto-generated catch block
		    			}           	            		
			        }          
			}
				}
		});
		//挂起队列双击解挂
		suspendList.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				if(e.getClickCount()==2&&e.getX()<=150){
				String selectedSuspendedItem = null;
				String id = "";
				if(suspendedPCB.getNumberOfItems() == 0)
	            {
					statuesTextArea.append("挂起队列为空!\n");
	            } else {
	            	try {
	            		selectedSuspendedItem = (String) suspendList.getSelectedValue();
	                    if(selectedSuspendedItem == null)  {
	                    	statuesTextArea.append("请从挂起队列里面选择一个进程!\n");
	                    } else
	                    {
	                    	StringTokenizer stringtokenizer = new StringTokenizer(selectedSuspendedItem, "_");
	            			id = stringtokenizer.nextToken();
	            			ProcessPCB selectedItem = suspendedPCB.getItem(id);
	                    	if(selectedItem == null)  {
	                    		statuesTextArea.append("进程 " + id + " 不存在!\n");
	    	                }  else  {
	    	                	int s3 = selectedItem.getMemoryLimit();
	    	                	if(readyPCB.getNumberOfItems() < 6) {   	                		   	                		
	    	                		if(boolMemoryAllocation(s3)) {
	    	                			addToReadyList(id, selectedItem.getRequiredTime(), 
	    	                					        selectedItem.getRequiredTime(), s3, "r");
									    statuesTextArea.append("进程已被解挂进入了就绪队列!\n");
	    	                		} else {
	    	                			statuesTextArea.append("内存空间不足! PCB将被解挂进入后备队列!\n");
	    	                			addToBackupList(id, selectedItem.getRequiredTime(), 
	    	                					         selectedItem.getRequiredTime(), s3, "II");       	                		
	        		                    statuesTextArea.append("进程已被解挂入后备队列!\n");
	    	                		}
	    	                		
	    	                	} else {
	    	                		statuesTextArea.append("就绪队列已满! 新的进程将被解挂进入后备队列!\n");
	    	                		addToBackupList(id, selectedItem.getRequiredTime(), 
	           					         selectedItem.getRequiredTime(), s3, "II");
	    		                    statuesTextArea.append("进程已被解挂入后备队列!\n");
	    	                    }
	    	                	suspendedPCB.removeItem(selectedItem);   	
								suspendList.setListData(suspendedPCB.getItemsProperties()); 
								suspendTotalTextField.setText(Integer.toString(suspendedPCB.getNumberOfItems()));
	    	                 }               	
	                     }
	            	   } catch (RuntimeException e1) {
	    				// TODO Auto-generated catch block
	    			}           	      	             	
	             }
			}
				else if(e.getClickCount()==2&&e.getX()>150){
					String selectedRemovsItem = null;
					String id = "";
					if(suspendedPCB.getNumberOfItems() == 0)
		            {
						statuesTextArea.append("记录为空!\n");
		            } else
		            {
		            	selectedRemovsItem = (String) suspendList.getSelectedValue();
		                if(selectedRemovsItem == null)  {
		                	statuesTextArea.append("ID不能为空!\n");
		                } else {
		                	StringTokenizer stringtokenizer = new StringTokenizer(selectedRemovsItem, "_");
		        			id = stringtokenizer.nextToken();
		        			ProcessPCB suspendedItem = suspendedPCB.getItem(id);
		                	if(suspendedItem == null)  {
		                		statuesTextArea.append("进程" + id + " 不存在!\n");
			                }  else  {
			                	suspendedPCB.removeItem(suspendedItem);
			                	suspendList.setListData(suspendedPCB.getItemsProperties()); 
			                    statuesTextArea.append("进程已被移除!\n");
			                 }
		                	suspendTotalTextField.setText(Integer.toString(suspendedPCB.getNumberOfItems()));
		                }               	
			        }
				}
			}
		});
		
	}
	
	/**
	 * PCB项目信息的面板
	 * @return
	 */
	public JPanel initPCBItemPanel() {
		
		JPanel iniPCBItemJPanel = new JPanel(new GridLayout(1,2));
		JPanel iniNamePanel = new JPanel(new GridLayout(6, 1));
		JPanel iniValuePanel = new JPanel(new GridLayout(6, 1));
		PIDLabel = new JLabel("PID:",JLabel.CENTER);
		requiredTimeLabel = new JLabel("所需时间:",JLabel.CENTER);
		priorityLabel = new JLabel("优先级:",JLabel.CENTER);
		statuesLabel = new JLabel("状态:",JLabel.CENTER);
		baseLabel = new JLabel("基址:",JLabel.CENTER);
		limitLabel = new JLabel("分配内存:",JLabel.CENTER);
		iniNamePanel.add(PIDLabel);
		iniNamePanel.add(requiredTimeLabel);
		iniNamePanel.add(priorityLabel);
		iniNamePanel.add(statuesLabel);
		iniNamePanel.add(baseLabel);
		iniNamePanel.add(limitLabel);
		
		PIDTextField = new JTextField("", 10);
		//获取焦点
		this.addWindowFocusListener(new WindowAdapter() {
		    public void windowGainedFocus(WindowEvent e) {
		        PIDTextField.requestFocusInWindow();
		    }
		});
		PIDTextField.setEditable(true);
		requiredTimeTextField = new JTextField("", 10);
		requiredTimeTextField.setEditable(true);
		priorityTextField = new JTextField("", 10);
		priorityTextField.setEditable(true);
		statusTextField = new JTextField("", 10);
		statusTextField.setEditable(false);
		baseTextField = new JTextField("", 10);
		baseTextField.setEditable(false);
		limitTextField = new JTextField("", 10);
		limitTextField.setEditable(true);
		limitTextField.setToolTipText("内存不可大于或等于1000");
		iniValuePanel.add(PIDTextField);
		iniValuePanel.add(requiredTimeTextField);
		iniValuePanel.add(priorityTextField);
		iniValuePanel.add(statusTextField);
		iniValuePanel.add(baseTextField);
		iniValuePanel.add(limitTextField);
		
		iniPCBItemJPanel.add(iniNamePanel);
		iniPCBItemJPanel.add(iniValuePanel);
		
		return iniPCBItemJPanel;
	}
	
	 /**
	  * 在PCB项目信息中显示鼠标选中的进程的信息
	  * @param pcb
	  */
	public void displayInformation(ProcessPCB pcb) {
		
		PIDTextField.setText(pcb.getPID());
		requiredTimeTextField.setText(Integer.toString(pcb.getRequiredTime()));
		priorityTextField.setText(Integer.toString(pcb.getPriority()));
		statusTextField.setText(pcb.getStatus());
		baseTextField.setText(Integer.toString(pcb.getMemoryBase()));
		limitTextField.setText(Integer.toString(pcb.getMemoryLimit()));
	}
	/**
	 * 显示后备队列进程类
	 * @author ctong
	 *
	 */
	class DisplayBackupProcessListener implements ListSelectionListener {
		
		public void valueChanged(ListSelectionEvent event) {
			if (! backupList.getValueIsAdjusting()) {               
				String id = null, selectedBAKItem = null; 
				selectedBAKItem = (String) backupList.getSelectedValue();
				if(selectedBAKItem  != null) {
					StringTokenizer stringtokenizer = new StringTokenizer(selectedBAKItem, "_");
					id = stringtokenizer.nextToken();					
					ProcessPCB backupItem = backupPCB.getItem(id);
					if(backupItem != null)
					{
						displayInformation(backupItem);
					}
					statuesTextArea.append(backupItem.toString() + "进程 " + id
					                       + "加入后备队列了!\n");
				}
			}
		}
	}
	/**
	 * 显示挂起队列进程类
	 * @author ctong
	 *
	 */
	class DisplaySuspendedProcessListener implements ListSelectionListener {

		public void valueChanged(ListSelectionEvent event) {
			if (! suspendList.getValueIsAdjusting()) {
				String id = ""; 
				String str = (String) suspendList.getSelectedValue();
				if(str != null) {
					StringTokenizer strtokenizer = new StringTokenizer(str, "_");
					id = strtokenizer.nextToken();					
					ProcessPCB selectedSuspendedItem = suspendedPCB.getItem(id);
					if(selectedSuspendedItem != null)
					{
						displayInformation(selectedSuspendedItem);
					}					
					statuesTextArea.append(selectedSuspendedItem.toString() + "进程 " + id
					                       + "加入挂起队列了!\n");
				}
			}
		}
	}
	/**
	 * 显示就绪队列进程类
	 * @author ctong
	 *
	 */
	class DisplayreadyProcessListener implements ListSelectionListener {
		
		public void valueChanged(ListSelectionEvent event) {
			if (! readyList.getValueIsAdjusting()) {              
				String id = null, s = null; 
				s = (String) readyList.getSelectedValue();
				if(s != null) {
					StringTokenizer sttokenizer = new StringTokenizer(s, "_");
					id = sttokenizer.nextToken();
					ProcessPCB readyItem = readyPCB.getItem(id);
					if(readyItem != null)
					{
						displayInformation(readyItem);
					}
					statuesTextArea.append(readyItem.toString() + "进程 " + id
					                       + "加入就绪队列了!\n");
				}      
			}
		}
	}
	/**
	 * 内存可分分区表排序,按可用内存大小降序排列
	 */
	public void sortMemoryList() {
		MemoryRecords currentListItems = new MemoryRecords();
		int num = memoryItems.getNumberOfItems();
		if(num>0)  {
			for(int i=num; i>=1; i--) {
				Iterator memoryIterator = memoryItems.iterator();
				MemoryItem currentItem = (MemoryItem) memoryIterator.next();
				for( ; memoryIterator.hasNext(); ) {
					MemoryItem nowItem = (MemoryItem) memoryIterator.next();
					if(currentItem.getMemoryLimit() < nowItem.getMemoryLimit()) {
						currentItem = null;
						currentItem = nowItem;
					}	
				}
				currentListItems.addItem(currentItem);
				memoryItems.removeItem(currentItem);
			}
			memoryItems = null;
			memoryItems = currentListItems;	
		}
		memoryList.setListData(memoryItems.getItemsProperties());
	}
	  /**
	   * 判断能否为进程分配内存
	   * @param neededLimit
	   * @return
	   */
	public boolean boolMemoryAllocation(int neededLimit) {
		if(memoryItems.getNumberOfItems()>0) {
			Iterator memoryListIteartor = memoryItems.iterator();
			MemoryItem lagerestItem = (MemoryItem) memoryListIteartor.next();
			if(lagerestItem.getMemoryLimit()>= neededLimit)
				return true;
			else {
				return false;
			}				
		} else {
			return false;
		}			
	}
	/**
	 * 内存分配,按最先适应算法原则
	 * @param neededLimit
	 * @return
	 */
	public int MemoryAllocation(int neededLimit) {
		int currentBase=-1, currentLimit=-1;
		Iterator memoryListIteartor = memoryItems.iterator();
		MemoryItem lagerestItem = (MemoryItem) memoryListIteartor.next();
		currentBase = lagerestItem.getMemoryBase()+neededLimit;
		currentLimit = lagerestItem.getMemoryLimit()-neededLimit;
		memoryItems.removeItem(lagerestItem);
		if(currentLimit>0) {
			memoryItems.addItem(new MemoryItem(currentBase, currentLimit));
		}
		sortMemoryList();
		return lagerestItem.getMemoryBase();
	}
	/**
	 * 内存回收
	 * @param nowBase
	 * @param nowLimit
	 */
	public void memoryRecall(int nowBase, int nowLimit) {
		MemoryItem recallItem = null;
		int recalledBase = nowBase;
		int recalledLimit = nowLimit;
		if(memoryItems.getNumberOfItems()>0) {
			Iterator memoryListIteartor = memoryItems.iterator();
			for( ;memoryListIteartor.hasNext(); ) {
				MemoryItem existedItem = (MemoryItem) memoryListIteartor.next();
				if(existedItem.getMemoryBase() == (nowBase+nowLimit)) {
					recalledLimit = recalledLimit+existedItem.getMemoryLimit();
					memoryItems.removeItem(existedItem);	
					memoryListIteartor = memoryItems.iterator();
				} else if(nowBase == (existedItem.getMemoryBase()+existedItem.getMemoryLimit())) {
					recalledBase = existedItem.getMemoryBase();
					recalledLimit = recalledLimit+existedItem.getMemoryLimit();
					memoryItems.removeItem(existedItem);
					memoryListIteartor = memoryItems.iterator();
				}								
			}
		} 
		recallItem = new MemoryItem(recalledBase, recalledLimit);
		memoryItems.addItem(recallItem);
		sortMemoryList();	
	}
	/**
	 * 把字符串读成整数
	 * @param s
	 * @return
	 */
	public int readInteger(String s) {
		int num = -1;
		try  {
			num = Integer.parseInt(s);
			}  catch(NumberFormatException numberformatexception) {				
	    		 statuesTextArea.append("请输入一个正整数!\n");
	    		 num = -999;
	        }	
	    return num;
	}
	/**
	 * 加入后备队列函数
	 * @author ctong
	 *
	 */
	public void addToBackupList(String newID, int s1, int s2, int s3, String s) {
		      ProcessPCB item = backupPCB.getItem(newID);
        	  if(item != null) {
        		  statuesTextArea.append("PCB " + newID + " 已经存在于后备队列了!\n"
			                 + "你需要去改变所选PCB的PID!\n");
        		  while(item != null) {	
                		newID = s + newID;
                		item = backupPCB.getItem(newID);
                  }
        	  }
              ProcessPCB newPCB = new ProcessPCB(newID, s1, s2, "Waiting", -1, s3);
              backupPCB.addItem(newPCB);
              backupList.setListData(backupPCB.getItemsProperties());
              backupTotalTextField.setText(Integer.toString(backupPCB.getNumberOfItems()));
	}
	/**
	 * 加入就绪队列函数
	 * @author ctong
	 *
	 */
	public void addToReadyList(String nowID, int s1, int s2, int s3, String s) {	
		ProcessPCB item = readyPCB.getItem(nowID);
  	    if(item != null) { 	    	
  		    statuesTextArea.append("PCB " + nowID + " 已经存在于就绪队列了!\n"
	                                + "你需要去改变所选PCB的PID!\n");
  		    while(item != null) {	
  			    nowID = s + nowID;
          		item = backupPCB.getItem(nowID);
            }
  	    }
  	  int s4=MemoryAllocation(s3);
  	  rate+=s3;
  	  jpr.setValue(rate);
	  sortMemoryList();
	  ProcessPCB newPCB = new ProcessPCB(nowID, s1, s2, "Ready", s4, s3);
      readyPCB.addItem(newPCB);
      sortReadyPCB();    	  
	}
	/**
	 * 监听加入后备队列按钮
	 * @author ctong
	 *
	 */
	class AddToBAKListener implements ActionListener {
		public void actionPerformed(ActionEvent event) {
			String newID = PIDTextField.getText();
			String newTime = requiredTimeTextField.getText();
			String newPriority = priorityTextField.getText();
			String newLimit = limitTextField.getText();
			int s1 = 0, s2 = 0, s3 = 0, tag1=-1, tag2=-1, tag3=-1;
			
			if(newTime != null)
	        {	        	
				s1 = readInteger(newTime);
				if(s1 > 0.0) tag1 = 1;
	            else  statuesTextArea.append("所需时间必须是个正整数.\n");
	        } 
			if(newPriority != null)
	        {
				s2 = readInteger(newPriority);  
                if(s1 != -999) tag2 = 1;
	            else statuesTextArea.append("优先级必须是个正整数.\n");
	        } 
			if(newLimit != null)
	        {
				s3 = readInteger(newLimit);
				if(s3 > 0.0&&s3 < 1000) tag3 = 1;
	            else if(s3<=0) statuesTextArea.append("所需内存大小必须是个正整数.\n");
	            else {statuesTextArea.append("进程长度不能大于内存最大值.\n");
	            	JOptionPane.showMessageDialog(null, "进程长度不能大于内存最大值.", "错误", 2);
	            }
	        } 
			if(tag1 ==1 && tag2 == 1 && tag3 == 1) {
				if(newID == null)  {
	        		statuesTextArea.append("ID不能为空!\n");
	              } else {
	            	  addToBackupList(newID, s1, s2, s3, "B");
	                  statuesTextArea.append("PCB的信息加入后备队列里!\n");
	                  reset();
	              }
			}	
		}
	}
	/**
	 * 监听加入就绪队列按钮
	 * @author ctong
	 *
	 */
	class AddToReadyListener implements ActionListener {
	    public void actionPerformed(ActionEvent event) {

			String nowID = PIDTextField.getText();
			String time = requiredTimeTextField.getText();
			String priority = priorityTextField.getText();
			String limit = limitTextField.getText();
			int s1 = 0, s2 = 0, s3 =0;
			int tag1 = -1, tag2 = -1, tag3 = -1;
			if(time != null)
	        {	    
				s1 = readInteger(time);
	            if(s1 > 0.0)  tag1=1;
                else statuesTextArea.append("所需时间必须是个正整数.\n");	            
	        } 
			if(priority != null)
	        {
				s2 = readInteger(priority);
	            if(s2 != -999)  tag2=1;
                else statuesTextArea.append("优先级必须是个正整数.\n");
	        } 
			if(limit != null)
	        {	      
				s3 = readInteger(limit);
				if(s3 > 0.0&&s3 < 1000) tag3 = 1;
	            else if(s3<=0) statuesTextArea.append("所需内存大小必须是个正整数.\n");
	            else {statuesTextArea.append("进程长度不能大于内存最大值.\n");
	            	JOptionPane.showMessageDialog(null, "进程长度不能大于内存最大值.", "错误", 2);
	            }
	        } 
	        if(tag1 ==1 && tag2 == 1 && tag3 ==1) {
	        	if(nowID == null)  {
	        		statuesTextArea.append("ID不能为空!\n");
	              }  else  {
		              if(readyPCB.getNumberOfItems() < 6)  {
		            	  if(boolMemoryAllocation(s3)) {
		            		  addToReadyList(nowID, s1, s2, s3, "R");
			                  statuesTextArea.append("进程加入就绪队列!\n");
		            	  } else {
		            		  statuesTextArea.append("内存空间不足! PCB将被加载入后备队列!\n");
		            		  addToBackupList(nowID, s1, s2, s3, "b");
		            		  statuesTextArea.append("进程加入后备队列!\n");
		            	  }		            		  	            		  
		              } else {
		            	  statuesTextArea.append("就绪队列已满! 新的进程将被加载入后备队列!\n");
		            	  addToBackupList(nowID, s1, s2, s3, "b");
			              statuesTextArea.append("进程加入后备队列!\n");
		              }		            		  
		              reset();
	             }
	        }       
		}	    
	}
	/**
	 * 重置函数
	 */
	public void reset() {
		PIDTextField.setText("");
		requiredTimeTextField.setText("");
		if(!bflag)
		priorityTextField.setText("");
		statusTextField.setText("");
		baseTextField.setText("");
		limitTextField.setText("");
		
	}
	 /**
	  * 监听重置按钮	 
	  * @author ctong
	  *
	  */
	class ResetListener implements ActionListener {
		public void actionPerformed(ActionEvent event) {
			reset();
		}
	}
	 /**
	  * 监听挂起按钮
	  * @author ctong
	  *
	  */
	 //注:在挂起时,不会触发进程调度,而是在点击"startSyatemJButton"时才会出发进程调度
	class SuspendListener implements ActionListener {
		public void actionPerformed(ActionEvent event) {   
		String selectedReadyItem = null;
		String pid = "";
		if(readyPCB.getNumberOfItems() == 0)
        {
			statuesTextArea.append("就绪队列为空!\n");
        } else {
          	try {
            	selectedReadyItem = (String) readyList.getSelectedValue();
                if(selectedReadyItem == null)  {
                   	statuesTextArea.append("请选择一个进程放入就绪队列!\n");
                } else
                   {
                    	StringTokenizer stringtokenizer = new StringTokenizer(selectedReadyItem, "_");
            			pid = stringtokenizer.nextToken();
            			ProcessPCB selectedItem = readyPCB.getItem(pid);
                    	if(selectedItem == null)  {
                    		statuesTextArea.append("进程 " + pid + " 不存在!\n");
    	                }  else  {
    	                	ProcessPCB boolItem = suspendedPCB.getItem(pid);
    	                	if(boolItem != null) {
    	                		statuesTextArea.append("PCB " + pid + " 已经存在于挂起队列!\n"
       				                 + "你需要去修改所选择的PCB的PID!\n");
    	                		while(boolItem != null) {
    		                		pid = "S" + pid;
    		                		boolItem = suspendedPCB.getItem(pid);
    		                	}
    	                	}
    	                	  //注意下一步存在问题!   	                	
    	                	ProcessPCB newPcb = new ProcessPCB(pid, selectedItem.getRequiredTime(), 
    	                			selectedItem.getPriority(),"Suspended", -1, selectedItem.getMemoryLimit());   	                	
    	                	rate-=selectedItem.getMemoryLimit();
    	                	jpr.setValue(rate);
    	                	memoryRecall(selectedItem.getMemoryBase(), selectedItem.getMemoryLimit());
    	                	
    	                	suspendedPCB.addItem(newPcb);
    	                	readyPCB.removeItem(selectedItem);
    	                	sortReadyPCB(); 
    	                	suspendList.setListData(suspendedPCB.getItemsProperties());
    	                    statuesTextArea.append("进程已被挂起!\n");
    	                    suspendTotalTextField.setText(Integer.toString(suspendedPCB.getNumberOfItems()));
    	                 }
                    }  
            	} catch (RuntimeException e1) {
    				// TODO Auto-generated catch block
    			}           	            		
	        }          
        }
	}
	
	/**
	 * 对Ready队列进行优先级排序
	 */
	public void sortReadyPCB() {
		PCBRecords currentReadyPCB = new PCBRecords();
		int num = readyPCB.getNumberOfItems();
		if(num > 0) {
			for(int i=num; i>=1; i--) {
				Iterator readyIterator = readyPCB.iterator();
				ProcessPCB currentItem = (ProcessPCB) readyIterator.next();
				for( ; readyIterator.hasNext(); ) {
					ProcessPCB nowItem = (ProcessPCB) readyIterator.next();
					if(currentItem.getPriority() < nowItem.getPriority()) {
						currentItem = null;
						currentItem = nowItem;
					}	
				}
				currentReadyPCB.addItem(currentItem);
				readyPCB.removeItem(currentItem);
			}
			readyPCB = null;
			readyPCB = currentReadyPCB;
		}
		readyList.setListData(readyPCB.getItemsProperties()); 
	}
	 /**
	  * 实现解挂按钮的监听
	  */
	class UmountListener implements ActionListener {
		public void actionPerformed(ActionEvent event) {			
			String selectedSuspendedItem = null;
			String id = "";
			if(suspendedPCB.getNumberOfItems() == 0)
            {
				statuesTextArea.append("挂起队列为空!\n");
            } else {
            	try {
            		selectedSuspendedItem = (String) suspendList.getSelectedValue();
                    if(selectedSuspendedItem == null)  {
                    	statuesTextArea.append("请从挂起队列里面选择一个进程!\n");
                    } else
                    {
                    	StringTokenizer stringtokenizer = new StringTokenizer(selectedSuspendedItem, "_");
            			id = stringtokenizer.nextToken();
            			ProcessPCB selectedItem = suspendedPCB.getItem(id);
                    	if(selectedItem == null)  {
                    		statuesTextArea.append("进程 " + id + " 不存在!\n");
    	                }  else  {
    	                	int s3 = selectedItem.getMemoryLimit();
    	                	if(readyPCB.getNumberOfItems() < 6) {   	                		   	                		
    	                		if(boolMemoryAllocation(s3)) {
    	                			addToReadyList(id, selectedItem.getRequiredTime(), 
    	                					        selectedItem.getRequiredTime(), s3, "r");
								    statuesTextArea.append("进程已被解挂进入了就绪队列!\n");
    	                		} else {
    	                			statuesTextArea.append("内存空间不足! PCB将被解挂进入后备队列!\n");
    	                			addToBackupList(id, selectedItem.getRequiredTime(), 
    	                					         selectedItem.getRequiredTime(), s3, "II");       	                		
        		                    statuesTextArea.append("进程已被解挂入后备队列!\n");
    	                		}
    	                		
    	                	} else {
    	                		statuesTextArea.append("就绪队列已满! 新的进程将被解挂进入后备队列!\n");
    	                		addToBackupList(id, selectedItem.getRequiredTime(), 
           					         selectedItem.getRequiredTime(), s3, "II");
    		                    statuesTextArea.append("进程已被解挂入后备队列!\n");
    	                    }
    	                	suspendedPCB.removeItem(selectedItem);   	
							suspendList.setListData(suspendedPCB.getItemsProperties()); 
							suspendTotalTextField.setText(Integer.toString(suspendedPCB.getNumberOfItems()));
    	                 }               	
                     }
            	   } catch (RuntimeException e1) {
    				// TODO Auto-generated catch block
    			}           	      	             	
             }
	     }
	}
	/**
	 * 获取时间片
	 * @return
	 */
	public int getTimeslice() {	
		return timeslice;
	}
	/**
	 * 实现移除按钮的监听
	 */
	class RemoveListener implements ActionListener {

		public void actionPerformed(ActionEvent event) {
   
			String selectedRemovsItem = null;
			String id = "";
			if(suspendedPCB.getNumberOfItems() == 0)
            {
				statuesTextArea.append("记录为空!\n");
            } else
            {
            	selectedRemovsItem = (String) suspendList.getSelectedValue();
                if(selectedRemovsItem == null)  {
                	statuesTextArea.append("ID不能为空!\n");
                } else {
                	StringTokenizer stringtokenizer = new StringTokenizer(selectedRemovsItem, "_");
        			id = stringtokenizer.nextToken();
        			ProcessPCB suspendedItem = suspendedPCB.getItem(id);
                	if(suspendedItem == null)  {
                		statuesTextArea.append("进程" + id + " 不存在!\n");
	                }  else  {
	                	suspendedPCB.removeItem(suspendedItem);
	                	suspendList.setListData(suspendedPCB.getItemsProperties()); 
	                    statuesTextArea.append("进程已被移除!\n");
	                 }
                	suspendTotalTextField.setText(Integer.toString(suspendedPCB.getNumberOfItems()));
                }               	
	        }
        }      
	}
   /**
    * 内存进程调度
    */
	public void PCBSchudling() {
		while(readyPCB.getNumberOfItems() < 6) {
			if(backupPCB.getNumberOfItems() > 0) {
				Iterator bwackupPCBIterator = backupPCB.iterator();
				ProcessPCB newItem = (ProcessPCB) bwackupPCBIterator.next();
				readyPCB.addItem(newItem);
				backupPCB.removeItem(newItem);
				sortReadyPCB();
				readyList.setListData(readyPCB.getItemsProperties());
				backupList.setListData(backupPCB.getItemsProperties());
				backupTotalTextField.setText(Integer.toString(backupPCB.getNumberOfItems()));
			} else break;
		}
	}
	/**
	 * 
	 * @author ctong
	 * 调度线程
	 */
	class RunThread extends Thread {
		int t, TimeSlice;
		boolean Flag = true;
		public void run(){
			while(Flag) {	
				if(getSystemStatus() == 0) {
					Flag = false;
					break;
				} else if(getSystemStatus() == 2) {
					while(getSystemStatus() == 2) {
						try {
							Thread.sleep(1000);
						} catch (Exception ee) {
							ee.printStackTrace();
						}
					}
				}
				if(readyPCB.getNumberOfItems() < 6) {
					if(backupPCB.getNumberOfItems() > 0) {
						while(readyPCB.getNumberOfItems() < 6) {
							if(backupPCB.getNumberOfItems() > 0) {
								Iterator bwackupPCBIterator = backupPCB.iterator();
								ProcessPCB newItem = (ProcessPCB) bwackupPCBIterator.next();
								while(bwackupPCBIterator.hasNext() ) {
									int s = newItem.getMemoryLimit();
									if (boolMemoryAllocation(s)) {
										break;
									} else 
										newItem = (ProcessPCB) bwackupPCBIterator.next();		
									if(newItem == null) break;
								}
								if(newItem != null) {
									int bbase=0;
									int llimit = newItem.getMemoryLimit();
									rate+=llimit;
									jpr.setValue(rate);
									bbase = MemoryAllocation(llimit);
									ProcessPCB nowItem  = new ProcessPCB(newItem.getPID(), newItem.getRequiredTime(), newItem.getPriority(), 
											                                       "Ready", bbase, llimit);
									readyPCB.addItem(nowItem);
									backupPCB.removeItem(newItem);
									backupList.setListData(backupPCB.getItemsProperties());
									backupTotalTextField.setText(Integer.toString(backupPCB.getNumberOfItems()));
								} else {
									statuesTextArea.append("内存空间不足!\n");
									break;
								}														
							} else break;
						}
					}
				}
				sortReadyPCB();
				backupList.setListData(backupPCB.getItemsProperties());
				backupTotalTextField.setText(Integer.toString(backupPCB.getNumberOfItems()));
				Iterator readyIterator = readyPCB.iterator();
				ProcessPCB runningItem = null;
				if(readyIterator.hasNext()) {
					runningItem = (ProcessPCB) readyIterator.next();
				}
				if(runningItem != null) {
					
					t = runningItem.getRequiredTime();
					TimeSlice = getTimeslice()-1;
					for(int i=TimeSlice; i>=0; i--) {
						if(t >= 0) {
							runningItem.run();
							t--;
							sortReadyPCB();
							if(getFlag() == true)
								
								CPUTextArea.setText("PCB " + runningItem.getPID() + " is running!\n");
							try {
								Thread.sleep(1000);
							} catch (Exception ee) {
								ee.printStackTrace();
							}
						}	
					}	CPUTextArea.setText("");
					
					
					if(t < 0) {
						Flag = false;
						statuesTextArea.append("该进程执行完成并且相应的PCB将从内存中移除!\n");
						rate-=runningItem.getMemoryLimit();
						jpr.setValue(rate);
						memoryRecall(runningItem.getMemoryBase(), runningItem.getMemoryLimit());
						readyPCB.removeItem(runningItem);
						runningItem = null;
						sortReadyPCB();
					}
					if(readyPCB.getNumberOfItems() > 0) 
						Flag = getFlag();
					else Flag = false;
				} else Flag = false;
				if(getSystemStatus() == 0) {
					Flag = false;
					break;
				} else {
					if(getSystemStatus() == 2) {
						while(getSystemStatus() == 2) {
							try {
								Thread.sleep(1000);
							} catch (Exception ee) {
								ee.printStackTrace();
							}
						}
					}
					if(getSystemStatus() == 1) Flag = true;	
				}			
			}	
		}
	}
	/**
	 * 获取标识符
	 * @return
	 */
	public boolean getFlag() {
		return this.flag;
	}
	/**
	 * 获取系统状态
	 * @return
	 */
	public int getSystemStatus() {
		return systemStatus;
	}
	/**
	 * 监听开始调度按钮
	 * @author ctong
	 *
	 */
	class StartSystemListener implements ActionListener {
		
		public void actionPerformed(ActionEvent event) {
			if(readyPCB.getNumberOfItems() > 0) {
				if(systemStatus == 0) { 
					Thread runThread = new RunThread();
					flag = true;
					runThread.start();
					systemStatus = 1;
					try {
						File f =new File("2.wav");
						clip=Applet.newAudioClip(f.toURL());
						clip.loop();
					}catch (Exception e) {
						e.printStackTrace();
					}	
					statuesTextArea.append("调度开始!\n");
				} else {
					statuesTextArea.append("重置完成!\n");
				}	
			} else statuesTextArea.append("就绪队列为空,请加入进程\n");
				 
		}
	}
	/**
	 * 系统暂停按钮的监听
	 * @author ctong
	 *
	 */
	class SystemPauseListener implements ActionListener {
		public void actionPerformed(ActionEvent event) {
			if(systemStatus == 1) {
				flag = false;
				systemStatus = 2;
				pauseButton.setText("继续(Pause)");
				clip.stop();
				statuesTextArea.append("暂停!\n");
			}  else if(systemStatus == 2) {
				flag = true;
				systemStatus = 1;
				pauseButton.setText("暂停(Pause)");
				clip.loop();
				statuesTextArea.append("系统继续!\n");
			} else {
				statuesTextArea.append("错误操作!\n");
			}		
		}
	}
	/**
	 * 系统重置按钮的监听
	 * @author ctong
	 *
	 */
    class ResetSystemListener implements ActionListener {
		
		public void actionPerformed(ActionEvent event) {
			if(systemStatus != 0) {
				clip.stop();
				rate=0;
				jpr.setValue(0);
				flag = false;
	            systemStatus = 0;
	            backupPCB = null;           
	            readyPCB = null;
	            suspendedPCB = null;
	            memoryItems = null;
	            backupPCB = new PCBRecords();
	    		readyPCB = new PCBRecords();
	    		suspendedPCB = new PCBRecords();
	    		backupList.setListData(backupPCB.getItemsProperties());
	    		readyList.setListData(readyPCB.getItemsProperties());
	    		suspendList.setListData(suspendedPCB.getItemsProperties());
	    		
	    		backupTotalTextField.setText("0");
	    		suspendTotalTextField.setText("0");
	    		CPUTextArea.setText("");
	            statuesTextArea.setText("");  
	            priorityJRB.doClick();
	            timeslice = 1;
	            timesliceJtf.setText("3");
	            memoryItems = new MemoryRecords();
	    		memoryList.removeAll();
	    		MemoryItem newMemoryItem = new MemoryItem(0,1000);
	            memoryItems.addItem(newMemoryItem);
	            memoryList.setListData(memoryItems.getItemsProperties());
	            statuesTextArea.append("系统重置!\n");
			} else {
				statuesTextArea.append("错误操作!\n");
			}
		}
	}
    /**
     * 监听优先级按钮
     * @author ctong
     *
     */
    class priotiryListener implements ActionListener {

		public void actionPerformed(ActionEvent event) {
			priorityTextField.setEditable(true);
			bflag=false;
    		timeslice = 1;
    	 }
    }
    /**
     * 监听时间片按钮
     * @author ctong
     *
     */
    class timeslicListener implements ActionListener {
    	public void actionPerformed(ActionEvent event) {
    		timeslice = getTimesliceText();
    		bflag=true;
    		priorityTextField.setText("0");
    		priorityTextField.setEditable(false);
    		if(timeslice <= 0) {
    			statuesTextArea.append("时间片必须是个正整数!\n");
    			timesliceJtf.setText("3");
    			timeslice = 1;
    		}
    	}
    }
    /**
     * 获取时间片中的数据
     * @return
     */
    public int getTimesliceText() {
    	int n;
    	
    	try  {
			n = Integer.parseInt(timesliceJtf.getText());
			}  catch(NumberFormatException numberformatexception) {				
	    		 statuesTextArea.append("时间片必须是个正整数!\n");
	    		 n = -999;
	        }
    	return n;
    }
}

 

package CPU;

import java.util.ArrayList;
import java.util.Iterator;

public class MemoryRecords implements Iterable<MemoryItem> {
	private ArrayList<MemoryItem> memoryItems;

	public Iterator<MemoryItem> iterator() {
		// TODO Auto-generated method stub
		return this.memoryItems.iterator();
	}

    public ArrayList<MemoryItem> getMemoryItems() {
		
		return this.memoryItems;
	}
    
    public MemoryRecords() {
    	this.memoryItems = new ArrayList<MemoryItem>();
    }
    
    public void addItem(MemoryItem newMemoryItem) {
    	this.memoryItems.add(newMemoryItem);
    }
    public void removeItem(MemoryItem momoryItem) {
    	this.memoryItems.remove(momoryItem);
    }
    
    public MemoryItem getMomoryItem(MemoryItem item) {
    	for(MemoryItem mItem : this.memoryItems) {
    		if(mItem.equals(item)){
    			return mItem;
    		}
    	}
    	return null;
    }
    public MemoryItem getMemoryItem(int base) {
    	for(MemoryItem mItem : this.memoryItems) {
    		if(mItem.getMemoryBase() == base) {
    			return mItem;
    		}
    	}
    	return null;
    }
    
    public int getNumberOfItems() {		
 		return this.memoryItems.size();
 	}
    
    public String[] getItemsProperties() {
    	String itemsProperties[] = new String[getNumberOfItems()];
    	int i=0;
    	for(Iterator iterator1 = this.memoryItems.iterator(); iterator1.hasNext(); ) {
    		MemoryItem mmItem = (MemoryItem) iterator1.next();
    		itemsProperties[i++] = mmItem.toString();
    	}
    	if(itemsProperties == null) {
    		itemsProperties[0] = "      ";
    	}
    	return itemsProperties;
    }
}

 

 

 

 欢迎留言!!!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java测试题2》<br><br>一、 选择<br>1.欲构造ArrayList类的一个实例,此类继承了List接口,下列哪个方法是正确的 ? B<br>A ArrayList myList=new Object();<br>B List myList=new ArrayList();<br>C ArrayList myList=new List();<br>D List myList=new List();<br>2.paint()方法使用哪种类型的参数? A<br>A Graphics<br>B Graphics2D<br>C String<br>D Color<br>3.指出正确的表达式 D<br>A byte=128;<br>B Boolean=null;<br>C long l=0xfffL;<br>D double=0.9239d;<br>4.指出下列程序运行的结果 D<br>public class Example{<br>String str=new String("good");<br>char[]ch={'a','b','c'};<br>  public static void main(String args[]){<br>    Example ex=new Example();<br>    ex.change(ex.str,ex.ch);<br>    System.out.print(ex.str+" and ");<br>    Sytem.out.print(ex.ch);<br>  }<br>  public void change(String str,char ch[]){<br>    str="test ok";<br>    ch[0]='g';<br>  }<br>}<br>A good and abc<br>B good and gbc<br>C test ok and abc<br>D test ok and gbc<br>5.运行下列程序, 会产生什么结果 B<br>public class X extends Thread implements Runable{<br> public void run(){<br>  System.out.println("this is run()");<br> }<br> public static void main(String args[])<br> {<br>  Thread t=new Thread(new X());<br>  t.start();<br> }<br>}<br>A 第一行会产生编译错误B 第六行会产生编译错误C 第六行会产生运行错误D 程序会运行和启动6.要从文件" file.dat"文件中读出第10个字节到变量C中,下列哪个方法适合? A<br>A FileInputStream in=new FileInputStream("file.dat"); in.skip(9); int c=in.read();B FileInputStream in=new FileInputStream("file.dat"); in.skip(10); int c=in.read();C FileInputStream in=new FileInputStream("file.dat"); int c=in.read();D RandomAccessFile in=new RandomAccessFile("file.dat"); in.skip(9); int c=in.readByte();7.容器被重新设置大小后,哪种布局管理器的容器中的组件大小不随容器大小的变化而改变? B<br>A CardLayoutB FlowLayout<br>C BorderLayout<br>D GridLayout<br>8.给出下面代码: C<br>public class Person{<br>  static int arr[] = new int[10];<br><br>  public static void main(String a[])<br>  {<br>   System.out.println(arr[1]);<br>  }<br>}<br>那个语句是正确的?<br>A 编译时将产生错误;<br>B 编译时正确,运行时将产生错误;<br>C 输出零;<br>D 输出空。<br>9.哪个关键字可以对对象加互斥锁? B<br>A transient<br>B synchronized<br>C serialize<br>D static<br>10.下列哪些语句关于内存回收的说明是正确的? B<br>A 程序员必须创建一个线程来释放内存;<br>B 内存回收程序负责释放无用内存<br>C 内存回收程序允许程序员直接释放内存<br>D 内存回收程序可以在指定的时间释放内存对象<br>11.下列代码哪几行会出错: c<br>1) public void modify() {<br>2) int I, j, k;<br>3) I = 100;<br>4) while ( I > 0 ) {<br>5) j = I * 2;<br>6) System.out.println (" The value of j is " + j );<br>7) k = k + 1;<br>8) I--;<br>9) }<br>10) }<br>A line 4<br>B line 6<br>C line 7<br>D line 8<br>二、多项选择<br>1.执行下列代码后,哪个结论是正确的 String[] s=new String[10]; BD<br>A s[10] 为 "";<br>B s[9] 为 null;<br>C s[0] 为 未定义<br>D s.length 为10<br>2.下面的表达式哪个是正确的?AE<br>A String s="你好";int i=3; s+=i;<br>B String s="你好";int i=3; if(i==s){ s+=i};<br>C String s="你好";int i=3; s=i+s;<br>D String s="你好";int i=3; s=i+;<br>E. String s=null; int i=(s!=null)&&(s.length>0)?s.length():0;<br>3.选出合理的标识符AC<br>A _sys1_lll<br>B 2mail<br>C $change<br>D class<br>4.哪个布局管理器使用的是组件的最佳尺寸( preferred size) AE<br>A FlowLayout<br>B BorderLayout<br>C GridLayout<br>D CardLayout<br>E.GridBagLayout<br>5.下列哪个方法可用于创建一个可运行的类?AE<br>A public class X implements Runable{ public void run(){ ......} }<br>B public class X implements Thread{ public void run(){ ......} }<br>C public class X implements Thread{ public int run(){ ......} }<br>D public class X implements Runable{ protected void run(){ ......} }<br>E.public class X implements Thread{ public void run(){ ......} }<br>6.下面哪个方法可以在任何时候被任何线程调用?DEF<br>A notify()<br>B wait()<br>C notifyAll()<br>D sleep()<br>E.yield()<br>F.synchronized(this)<br>7.构造BufferedInputStream的合适参数是哪个? AC<br>A BufferedInputStream<br>B BufferedOutputStream<br>C FileInputStream<br>D FileOuterStream<br>E. File<br>8.下列说法正确的是 BC<br>A java.lang.Clonable是类<br>B java.lang.Runnable是接口<br>C Double对象在java.lang包中<br>D Double a=1.0是正确的java语句<br>9.指出正确的表达式AB<br><br>B Double a=new Double(1.0);<br>C byte a = 340;<br>D Byte a = 120;<br>10.定义一个类名为"MyClass.java"的类,并且该类可被一个工程中的所有类访问,那么该类的正确声明应为:CD<br>A double a=1.0;<br>A private class MyClass extends Object<br>B class MyClass extends Object<br>C public class MyClass<br>D public class MyClass extends Object<br>11.指出下列哪个方法与方法public void add(int a){}为合理的重载方法。 CD<br><br><br>A public int add(int a)<br>B public void add(long a)<br>C public void add(int a,int b)<br>D public void add(float a)<br>12.如果下列的方法能够正常运行,在控制台上将显示什么? ACD<br><br>public void example(){<br>  try{<br>    unsafe();<br>    System.out.println("Test1");<br>    }<br>    catch(SafeException e)<br>    {System.out.println("Test 2");}<br>  finally{System.out.println("Test 3");}<br>  System.out.println("Test 4");<br>}<br>A Test 1<br>B Test 2<br>C Test 3<br>D Test 4<br>13.下列哪些情况可以终止当前线程的运行? ABD<br>A 抛出一个例外时。<br>B 当该线程调用sleep()方法时。<br>C 当创建一个新线程时。<br>D 当一个优先级高的线程进入就绪状态时。<br>三、 填空题<br>1.执行下列代码后的结果是什么? int x,a=2,b=3,c=4; x=++a+b+++c++;<br>2. 包包含了Collection的接口和类的API<br>.main方法的声明格式包括<br>4.下列程序中构造了一个SET并且调用其方法add(),输出结果是<br>public class A{<br>public int hashCode(){return 1;}<br>public Boolean equals(Object b){return true}<br>public static void main(String args[]){ Set set=new HashSet();<br>set.add(new A());<br>set.add(new A());<br>set.add(new A());<br>System.out.println(set.size());<br>}<br>}<br>5.下列程序的运行结果是<br>class A{<br>class Dog{<br>  private String name;<br>  private int age;<br>  public int step;<br>  Dog(String s,int a){<br>   name=s;<br>   age=a;<br>   step=0;<br>   }<br>  public void run(Dog fast){<br>  fast.step++;<br>  }<br>}<br><br>  public static void main (String args[]){<br>  A a=new A();<br>  Dog d=a.new Dog("Tom",3);<br>  d.step=25;<br>  d.run(d);<br>  System.out.println(d.step);<br>  }<br>}<br><br>答案::填空第1题<br>x=10,a=3,b=4,c=5<br>填空第2题<br>java.util<br>填空第3题<br>(public )(static )(void)(main)(String args[])<br>填空第4题<br>1<br>填空第5题<br>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值