Frage

  

Mögliche Duplizieren:
   Wie beginne ich meinen Java-Code zu optimieren ? - CPU ist bei 100%

Ich habe eine Methode isReset (), das ist wie verrückt Ausführung i definiert als

   public boolean isReset() { return reset; 
   }

in einer anderen Klasse. die Klasse unten ist die einzige Klasse, die diesen Code verwendet wird.

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.KeyStroke;
import javax.swing.border.BevelBorder;
import javax.swing.border.SoftBevelBorder;


// TimerQueue

public class SkaTest {
   public static final int WIDTH = 500;
   public static final int HEIGHT = 500;
   public static final int CANVAS_X = 100;
   public static final int CANVAS_Y = 100;
   public static final int CANVAS_FRAME_WIDTH = WIDTH+100;
   public static final int CANVAS_FRAME_HEIGHT = HEIGHT + 100;
   public static final int EXEC_WIDTH = 550;
   public static final int EXEC_HEIGHT = 400;

   static VizDSList dsList = new VizDSList();
   static SkaCanvas canvas = new SkaCanvas(dsList);
   static JFrame canvasFrame = new JFrame("Data Structure Canvas");
   static JMenuBar menuBar = new JMenuBar();
   static JMenu algorithmMenu = new JMenu("Algorithm");
   static JMenu dsMenu = new JMenu("Create");
   static JMenu helpMenu = new JMenu ("Help");
   static JLabel status = new JLabel(" ");   

   static SkaProgram[] alg;
   static JFrame execFrame[];
   static SkaExecutionPanel execPanel[];


   public static void setupFrames(int nAlgs) {
      int i; 

      for (i=0; i < nAlgs; i++) {
         // execFrame[i] = new JFrame("Execution Control Panel "+(i+1));
         execFrame[i] = new JFrame();
         execPanel[i] = new SkaExecutionPanel(execFrame[i]);
      }

      canvas.setMinimumSize(new Dimension(WIDTH, HEIGHT));
      canvasFrame.setSize(CANVAS_FRAME_WIDTH, CANVAS_FRAME_WIDTH);
      canvasFrame.getContentPane().setLayout(new BorderLayout(10,7));
      // canvasFrame.getContentPane().setPreferredSize(new Dimension(WIDTH, HEIGHT));
      canvasFrame.addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent e) {
            System.exit(0);
         }
      });
      // canvas.setMinimumSize(new Dimension(WIDTH, HEIGHT));

      for (i=0; i < nAlgs; i++) {
         execFrame[i].setSize(EXEC_WIDTH, EXEC_HEIGHT);
         // execFrame[i].getContentPane().setLayout(new BorderLayout(10,7));
         execFrame[i].addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
               System.exit(0);
            }
         });
         execPanel[i].setBorder(new SoftBevelBorder(BevelBorder.RAISED));
         // execFrame[i].setContentPane(execPanel[i]);
         execFrame[i].getContentPane().add("Center", execPanel[i]);
         // execFrame[i].setLocation(CANVAS_X +CANVAS_FRAME_WIDTH, CANVAS_Y + i*EXEC_HEIGHT);
         execFrame[i].setLocation(CANVAS_X +CANVAS_FRAME_WIDTH + i*30, CANVAS_Y + i*50);
      }

      canvas.setBorder(new SoftBevelBorder(BevelBorder.RAISED));
      canvasFrame.getContentPane().add("Center", new JScrollPane(canvas) );
      // canvasFrame.getContentPane().add("Center", new JScrollPane(canvas, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS) );
      canvasFrame.getContentPane().add("South", status);
      canvasFrame.setLocation(CANVAS_X, CANVAS_Y);

      JMenu fileMenu = new JMenu("File");
      JMenuItem quitItem = new JMenuItem("Quit");
      //TODO Add quit listener
      quitItem.addActionListener(new ActionListener ()
      {


        public void actionPerformed(ActionEvent arg0) {
            //System.exit(0);

            int again = JOptionPane.showConfirmDialog(null, "Are you sure you want to exit system", "Exiting", JOptionPane.YES_NO_OPTION);
            if (again == JOptionPane.YES_OPTION)
            {
                System.exit(0);
            }


        }

      }
      );
      fileMenu.add(quitItem);
      menuBar.add(fileMenu);
      menuBar.add(algorithmMenu);
     // menuBar.add(dsMenu);
      menuBar.add(helpMenu);
      JMenuItem help = new JMenuItem ("Help Contents");
      //help.setMnemonic(KeyEvent.VK_H);
      //TODO Fix this method
      help.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, ActionEvent.CTRL_MASK));
      help.addActionListener(new ActionListener()
      {
/*
        @Override
        public void actionPerformed(ActionEvent arg0) {
            JOptionPane.showMessageDialog(null, "Alot of the functionality have not yet been included in this version\nCurrently working on the automation features now!", "SKA 0.2 Beta", JOptionPane.WARNING_MESSAGE);

        }
*/

        public void actionPerformed(ActionEvent arg0) {
            try {
                Runtime.getRuntime().exec("hh.exe C:/ska.chm");
            } catch (IOException e) {
                e.printStackTrace();
                JOptionPane.showMessageDialog(null, "File not found", "Error", JOptionPane.ERROR_MESSAGE);
            }


        }

      });
      JMenuItem about = new JMenuItem ("About SKA");
      about.addActionListener(new ActionListener(){


        public void actionPerformed(ActionEvent arg0) {
        JOptionPane.showMessageDialog(null, "SKA Version 0.1 Beta");

        }
    });
      helpMenu.add(help);
      helpMenu.add(about);
      canvasFrame.setJMenuBar(menuBar);
   }

   /** The create menu item  */
   public static void createProgram(int i) {
      JMenuItem algItem;
      switch (i) {
      case 0 :
          alg[0] = new RedBlackValidate(canvas, execPanel[0]);
          execFrame[0].setTitle("Validate Algorithm");
          System.out.println("Validate Algorithm");
          algItem = new JMenuItem("Validate Algorithm");
          algorithmMenu.add(algItem);
          break;
      default:
         break;         
      }
   }


   public static void main(String args[]) {
      int i, nAlgs = 1; //nAlgs = 7;

      alg = new SkaProgram[nAlgs];
      execPanel = new SkaExecutionPanel[nAlgs];
      execFrame = new JFrame[nAlgs];

      // canvas.setDebugGraphicsOptions(DebugGraphics.BUFFERED_OPTION);
      setupFrames(nAlgs);
      canvasFrame.setVisible(true);


      for (i=0; i < alg.length; i++) {
         createProgram(i);
         execFrame[i].setVisible(true);
         alg[i].start();
         alg[i].displayAlgorithm();
      }

      while (true) {
         for (i=0; i < alg.length; i++) 
            if (execPanel[i].isReset()) {
               alg[i].terminate();
               createProgram(i);
               alg[i].start();
               execPanel[i].unreset();
            }         
      }
   }
}  // End class SkaTest
War es hilfreich?

Lösung

nichts falsch mit dem isReset, aber dieser Schleife nicht nur nennt es immer und immer und immer wieder (und immer und immer ...)?

 while (true) {
     for (i=0; i < alg.length; i++) 
        if (execPanel[i].isReset()) {
           alg[i].terminate();
           createProgram(i);
           alg[i].start();
           execPanel[i].unreset();
        }         
  }

Wenn nichts anderes, können Sie ein Thread.yield() schlagen dort den Faden zu zwingen, seine Zeitscheibe regelmäßig zu geben, damit es nicht die CPU nicht in Beschlag nehmen.

Besser wäre es, die Polling-Graben und stattdessen einen Listener-basierten Ansatz. Lassen Sie die execPanels Zuhörer informieren, wenn sie statt mit einer Schleife wiederholt sich zurückgesetzt werden fragen, ob sie zurückgesetzt werden. Dieser Code ist das Äquivalent von „Sind wir schon da? Sind wir schon da? Sind wir schon da?“

Sie können auch die Zuhörer sehen bezeichnet als Beobachter . Wenn Sie weitere Informationen schauen Sie sich um diesen Entwurfsmuster viele gute Informationen werden aufdrehen beiden Begriffe verwenden.

Beispiel

Hier ist, wie Sie Ihren Code neu schreiben könnten den Hörer Konzept zu verwenden. Ich für Fehler in diesem Code entschuldigen, ich habe es nicht kompiliert. Hoffentlich werden die Ideen sind klar trotz aller Fehler, die ich in den Code haben könnte.

Wenn der Code keinen Sinn sofort machen Besuche über meine Links. Oder Sie können mit EventListeners , die Sie ‚ll die ganze Zeit, wenn Sie die GUI-Programmierung Swingen.

public class SkaExecutionPanel {
    // Anybody who wants to be told when a panel is reset will implement
    // this interface and call addListener().
    public interface Listener {
        void panelReset(SkaExecutionPanel panel);
    }

    // Each panel needs to maintain an internal list of listeners.
    private List<Listener> listeners = new ArrayList<Listener>();

    public void addListener(Listener listener) {
        listeners.add(listener);
    }

    public void removeListener(Listener listener) {
        listeners.remove(listener);
    }

    public void reset() {
        /* Do your thing. */

        // When something happens that the listeners will care about, such as a
        // call to reset() in this case, you iterate through the list and tell
        // each one what's happened.
        for (Listener listener: listeners) {
            listener.panelReset(this);
        }
    }
}

public class SkaTest {
    public static void main(String args[]) {
        /* Snippety snip. */

        for (i=0; i < alg.length; i++) {
            // Here we need to tell the execPanels that we want to do something
            // whenever somebody calls reset() on them. We will add a listener
            // to each panel that does the terminate/createProgram/start dance.
            // This way we don't have to ask the panels when they are reset; 
            // instead they will tell us when that happens.
            execPanel[i].addListener(new SkaExecutionPanel.Listener() {
                final int index = i;

                public void panelReset(SkaExecutionPanel panel) {
                    alg[index].terminate();
                    createProgram(index);
                    alg[index].start();
                    execPanel[index].unreset();
                }
            });
        }
    }
}

Andere Tipps

Dies ist aus der Bearbeitung auf meine Antwort auf Ihre erste Frage, nachdem Sie diese Informationen hinzugefügt:

"EDIT: Die while-Schleife ist eine Endlosschleife eines for-Schleife verursacht, in dem laufen jedes Element in einem Array überprüft wurde, ob seine zurückgesetzt worden, um zu sehen Sie diese ersetzen können, mit einem Beobachter Muster, bei dem, wenn ein Objekt zurückgesetzt wird. es das Beobachtungsobjekt benachrichtigt, die dann diese Reihe von Schritten durchführt. auf diese Weise kann nicht in eine Endlosschleife und Sie über die Verwendung von .isReset abgeholzt (). "

EDIT: Das Problem mit den anderen Antworten ist, dass sie ein bisschen eines Codegeruch eine Endlosschleife meiner Meinung nach zu verwenden,

.

EDIT. 2: Hier ist der Wikipedia-Artikel mit einem Beispiel

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top