Hallo zusammen!
Ich versuche so eine Art Ein-Armigen-Banditen zu programmieren und schaffe es nicht, denn Thread wieder zu starten. Und zwar habe ich drei unabhängige Zählwalzen, die die Zahlen von 0 bis 9 durchlaufen und den aktuellen Wert in einem JLabel anzeigen:
Zu jeder Walze gibt es einen JButton, mit dem man die zugehörige Walze anhalten kann:
Das Anhalten geht, aber das Starten nicht. Wahrscheinlich ist das sleep das Problem, aber ich habe keine Ahnung, wie ich da wieder rauskomme. Wird die Walze angehalten, ist der Zustand der Zählwalze TIMED_WAITING, da ich die Walze ja im sleep-Zustand erwische. Wenn ich sie mit der proceed-Methode wiede starten will, dann wechselt sie nur in WAITING. Da komme ich dann auch durch ein weiteres notify() nicht mehr raus.
Irgendjemand eine Idee, wie ich
a) mein Problem lösen oder
b) das Problem insgesamt lösen kann?
Danke!
Ich versuche so eine Art Ein-Armigen-Banditen zu programmieren und schaffe es nicht, denn Thread wieder zu starten. Und zwar habe ich drei unabhängige Zählwalzen, die die Zahlen von 0 bis 9 durchlaufen und den aktuellen Wert in einem JLabel anzeigen:
Java:
class ZaehlWalze extends Thread {
private int von, nach, pause;
private JLabel anzeige;
boolean fPause = false; //neu
public ZaehlWalze(int von, int bis, int pause, JLabel newLabel) {
this.von = von;
nach = bis;
this.pause = pause;
anzeige = newLabel;
}
public void run() {
int i=0;
while (true) {
anzeige.setText(Integer.toString(i));
// Überprüfen, ob pausieren:
synchronized (this) {
while (fPause) {
try {
wait();
} catch (Exception e) {
System.out.println(e);
}
}
}
//Verzögerung
try {
this.sleep(pause);
} catch (InterruptedException ex) {
System.out.println(ex);
}
//Anzeige um 1 erhöhen
if (i==nach-1) {
i=0;
} else {
i++;
}
}
}
public void pause() {
fPause = true;
}
public void proceed() {
fPause = false;
notify();
}
}
Zu jeder Walze gibt es einen JButton, mit dem man die zugehörige Walze anhalten kann:
Java:
class Btn1Listener implements ActionListener{
public void actionPerformed(ActionEvent e) {
if (m1.isAlive() && btn1.getLabel().equals("Stop 1")) {
m1.pause();
auswertung();
} else if (m1.isAlive() && btn1.getLabel().equals("Start 1")) {
btn1.setLabel("Stop 1");
m1.proceed();
}
}
}
Das Anhalten geht, aber das Starten nicht. Wahrscheinlich ist das sleep das Problem, aber ich habe keine Ahnung, wie ich da wieder rauskomme. Wird die Walze angehalten, ist der Zustand der Zählwalze TIMED_WAITING, da ich die Walze ja im sleep-Zustand erwische. Wenn ich sie mit der proceed-Methode wiede starten will, dann wechselt sie nur in WAITING. Da komme ich dann auch durch ein weiteres notify() nicht mehr raus.
Irgendjemand eine Idee, wie ich
a) mein Problem lösen oder
b) das Problem insgesamt lösen kann?
Danke!