The following code it for a SlotMachine GUI with MultiThreads. When I hit the stop button in the app. I would expect each thread to be interrupted, go into the catch, print an error, continue for a few more "turns" then break. Unfortunately when the stop button is hit, it does not go into the catch and does not break. It actually appears that the numbers speed up. Can someone please shed some light? Why the threads are not interrupted even after Thread.interrupt();? Thank you!
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
@SuppressWarnings("serial")
public class SlotMachine extends Frame {
private TextField textWindow1, textWindow2, textWindow3, resultWindow;
private int count1 = 0, count2 = 0, count3 = 0, result1 = 0, result2 = 0,
result3 = 0;
private Button toggleButton;
public static final int HEIGHT = 150;
public static final int WIDTH = 100;
Random generator = new Random();
public static void main(String[] args) {
SlotMachine counterWindow = new SlotMachine();
counterWindow.setVisible(true);
}// main
public SlotMachine() {
setSize(WIDTH, HEIGHT);
addWindowListener(new WindowDestroyer());
setTitle("Slot Machine");
setBackground(Color.orange);
setLayout(new FlowLayout());
textWindow1 = new TextField(1);
add(textWindow1);
textWindow1.setText("*");
textWindow2 = new TextField(1);
add(textWindow2);
textWindow2.setText("*");
textWindow3 = new TextField(1);
add(textWindow3);
textWindow3.setText("*");
toggleButton = new Button("Start");
toggleButton.addActionListener(new ToggleButtonListener());
add(toggleButton);
resultWindow = new TextField(10);
add(resultWindow);
resultWindow.setText("");
}
private class box1Thread extends Thread {
public void run() {
while (true) {
try {
Thread.sleep(50);
result1 = (count1++) % 4;
textWindow1.setText(Integer.toString(result1));
} catch (InterruptedException e) {
System.err.println("Interrupted.");
int randomInt = generator.nextInt(25);
for (int i = 0; i < randomInt; i++) {
result1 = (count1++) % 4;
textWindow1.setText(Integer.toString(result1));
}
break;
}
}
}
}
private class box2Thread extends Thread {
public void run() {
while (true) {
try {
Thread.sleep(50);
result2 = (count2++) % 4;
textWindow2.setText(Integer.toString(result2));
} catch (InterruptedException e) {
System.err.println("Interrupted.");
int randomInt = generator.nextInt(25);
for (int i = 0; i < randomInt; i++) {
result2 = (count2++) % 4;
textWindow2.setText(Integer.toString(result2));
}
break;
}
}
}
}
private class box3Thread extends Thread {
public void run() {
while (true) {
try {
Thread.sleep(50);
result3 = (count3++) % 4;
textWindow3.setText(Integer.toString(result3));
} catch (InterruptedException e) {
System.err.println("Interrupted.");
int randomInt = generator.nextInt(25);
for (int i = 0; i < randomInt; i++) {
result3 = (count3++) % 4;
textWindow3.setText(Integer.toString(result3));
}
break;
}
}
}
}
private class ToggleButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
box1Thread counter1Thread = new box1Thread();
box2Thread counter2Thread = new box2Thread();
box3Thread counter3Thread = new box3Thread();
if (e.getActionCommand().equals("Stop")) {
counter1Thread.interrupt();
counter2Thread.interrupt();
counter3Thread.interrupt();
toggleButton.setLabel("Start");
if (result1 == result2 && result2 == result3) {
resultWindow.setText("You Win!");
} else {
resultWindow.setText("Sorry, You Lose!");
}
}
else if (e.getActionCommand().equals("Start")) {
counter1Thread.start();
counter2Thread.start();
counter3Thread.start();
toggleButton.setLabel("Stop");
resultWindow.setText("");
}
}
}
}