2016-07-25 29 views
-2

我試圖運行具有優先級隊列系統的調度程序的示例。它的工作方式如下:具有優先隊列拋出異常的調度程序

使用包含優先級的GUI輸入新進程。進程也通過GUI命令終止。上下文切換是通過命令來實現的,切換的原因並不重要。代碼中使用了三個組件,其中包括:基於優先級的就緒隊列,阻止列表和完成系統狀態的輸出,每個上下文切換顯示就緒,已阻止和正在運行的進程。

import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.PriorityQueue; 
import java.util.Queue; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
class dispatcher extends JFrame implements ActionListener { 
    static int processNo = 0; 
    static Process currentlyRunning; 
    static Queue<Process> readyQueue; 
    static Queue<Process> blockedQueue; 
    static JButton newProcess; 
    static JButton contextSwitch; 
    static JTextField priority; 
    static JTextArea Queues; 

    private static Process newProcess(int i, int i0, String running) { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 
    dispatcher() { 
     Container cp = getContentPane(); 
     cp.setLayout(new FlowLayout()); 
     Queues = new JTextArea(5, 15); 
     Queues.setPreferredSize(new Dimension(500, 400)); 
     cp.add(Queues); 
     cp.add(new JLabel("Priority")); 
     priority = new JTextField(6); 
     newProcess = new JButton("Create Process"); 
     newProcess.addActionListener(this); 
     cp.add(priority); 
     cp.add(newProcess); 
     contextSwitch = new JButton("Context Switch"); 
     contextSwitch.addActionListener(this); 
     cp.add(contextSwitch); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setTitle("Dispatcher"); 
     setSize(600, 500); 
     setVisible(true); 
    } 
    public static void main(String args[]) { 
     dispatcher d = new dispatcher(); 
     readyQueue = new PriorityQueue<>(); 
     blockedQueue = new PriorityQueue<>(); 
     Process p1 = newProcess(processNo++, 2, "Running"); 
     Process p2 = newProcess(processNo++, 1, "Blocked"); 
     Process p3 = newProcess(processNo++, 4, "Ready"); 
     Process p4 = newProcess(processNo++, 3, "Ready"); 
     Process p5 = newProcess(processNo++, 5, "Ready"); 
     Process p6 = newProcess(processNo++, 8, "Blocked"); 
     readyQueue.add(p3); 
     readyQueue.add(p4); 
     readyQueue.add(p5); 
     blockedQueue.add(p6); 
     blockedQueue.add(p2); 
     currentlyRunning = p1; 
     contextSwitch(); 
    } 
    static void createProcess(int priority) { 
     readyQueue.add(newProcess(processNo++, priority, "ready")); 
    } 
    static void contextSwitch() { 

     String sb; 
     String currentState = null; 
     sb = " " + currentlyRunning 
       + "Currently Running Process"+"\n" 
       + "Process No  Priority Current State\n" 
       + currentlyRunning+processNo 
       + " "+currentlyRunning+priority+currentState + "\n\n"; 
     currentState = "Blocked"; 
     blockedQueue.add(currentlyRunning); 
     currentlyRunning = readyQueue.poll(); 
     currentState = "Running"; 
     sb = sb + "Ready Queue\n" + "Process No Priority Current State\n"; 
     for (Process p : readyQueue) { 
      sb = sb + p+processNo + " " + p+priority + " " + p+currentState 
        + "\n\n"; 
     } 
     sb = sb + "\nBlocked Queue\n" + "Process No Priority Current State\n"; 
     for (Process p : blockedQueue) { 
      sb = "\n" 
        + sb + p+processNo + " " + p+priority + " " + p+currentState; 
      Queues.setText(sb); 
     } 
    } 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == newProcess) { 
      System.out.print("process"); 
      int p = Integer.parseInt(priority.getText()); 
      p = (p < 0) ? 2 : p; 
      createProcess(p); 
     } else{ 
      System.out.print("context"); 
      contextSwitch(); 
     } 
    } 
} 

輸出應該是這樣的:click here 但我發現了一個空白的圖形用戶界面是這樣的:click here 當我編譯的代碼,我得到了很多的例外。如果我輸入一個數字並點擊任何按鈕,我就會收到未知來源。但是,如果沒有在GUI中做任何事情,這是堆棧跟蹤:

Exception in thread "main" java.lang.UnsupportedOperationException: Not supported yet. 
    at dispatcher.newProcess(dispatcher.java:24) 
    at dispatcher.main(dispatcher.java:50) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 
+1

_「當我編譯代碼時,出現了很多異常」_ - 編譯代碼時沒有出現異常,您收到編譯器錯誤消息。顯示這些消息。 –

+0

我添加了堆棧跟蹤編譯錯誤,謝謝 – codingenthusiast

+0

@JimGarrison我發佈了錯誤,如果任何人都可以看一看,不勝感激 – codingenthusiast

回答

1

你的代碼是

public static void main(String args[]) { 
    dispatcher d = new dispatcher(); 
    readyQueue = new PriorityQueue<>(); 
    blockedQueue = new PriorityQueue<>(); 
    Process p1 = newProcess(processNo++, 2, "Running"); // <--- HERE 
    ... 

在線條爲標誌,你在呼喚你的方法newProcess()。該方法目前編碼爲拋出您看到的異常。

private static Process newProcess(int i, int i0, String running) { 
    throw new UnsupportedOperationException("Not supported yet."); 
} 

換句話說,您的代碼完全符合您的要求。

要解決此問題,您必須編寫代碼爲newProcess()