Método pico meu processador [duplicado]
-
10-07-2019 - |
Pergunta
Duplicate possíveis:
Como faço para começar a otimizar meu código Java ? - CPU está em 100%
Eu tenho um isReset () método que está executando como eu louco definiu como
public boolean isReset() { return reset;
}
em outra classe. a classe a seguir é a única classe que usa este código.
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
Solução
errado Nada com que isReset
, mas não este ciclo apenas chamá-lo mais e mais e mais (e mais e mais ...)?
while (true) {
for (i=0; i < alg.length; i++)
if (execPanel[i].isReset()) {
alg[i].terminate();
createProgram(i);
alg[i].start();
execPanel[i].unreset();
}
}
Se nada mais, você pode golpear um Thread.yield()
lá para forçar o segmento para desistir de sua fatia de tempo regularmente para que ele não monopolizar a CPU.
Melhor seria abandonar o polling e passar a usar uma abordagem baseada ouvinte. Permitir que as execPanel
s para notificar os ouvintes quando eles são repostos em vez de ter um laço repetidamente perguntar-lhes se eles são repostos. Este código é o equivalente de "Are we there yet? Será que estamos lá ainda? Somos nós lá ainda?"
Você também pode ver ouvintes referido como observadores . Se você olhar em volta para mais informações sobre este href="http://en.wikipedia.org/wiki/Design_pattern_(computer_science)" rel="nofollow padrão de design um monte de boa vontade informação transformar-se usando ambos os termos.
Exemplo
Veja como você pode reescrever seu código para usar o conceito ouvinte. Peço desculpas por quaisquer erros neste código, eu não compilou. Esperamos que as idéias são claras, apesar de todos os erros que eu possa ter no código.
Se o código não faz sentido imediato, confira meus links acima. Ou você pode brincar com EventListener
s , que você vai usar o tempo todo quando você faz a programação GUI swing.
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();
}
});
}
}
}
Outras dicas
Esta é a partir da edição para a minha resposta à sua primeira pergunta depois de ter adicionado estas informações:
"EDIT: O loop while é um loop infinito causando um loop para executar em que cada item em uma matriz tem sido verificado para ver se a sua sido reposto Você pode substituir isso com um padrão de observador, onde quando um objeto é reposto. , ele notifica o objeto observando que, em seguida, executa o conjunto de etapas. Desta forma, você não tem um loop infinito e você reduzir o uso de .isReset (). "
EDIT:. O problema com as outras respostas é que um pouco de cheiro de código para usar um loop infinito na minha opinião
EDIT 2:. Aqui está a wikipedia artigo com um exemplo