-1

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("");

        }
    }
}

}
Andrew Thompson
  • 168,117
  • 40
  • 217
  • 433
  • Why in 2013 is this code using the components of the last millennium? Why not use Swing? BTW - this had nothing to do with [tag:applet] beyond the generic meaning of 'small application'. – Andrew Thompson Feb 14 '13 at 05:26

2 Answers2

3

every time actionPerformed() is called, you are creating new threads. you need to create the threads once and save those references.

jtahlborn
  • 52,909
  • 5
  • 76
  • 118
1

I think the problem is the event handling process. Actually when you press stop, actioncommand is still at "Start". Instead of setting label, try using

toggleButton.setActionCommand("Stop");

Set actioncommand

Jason
  • 1,298
  • 1
  • 16
  • 27