-1

次のコードは、MultiThreads を使用する SlotMachine GUI 用です。アプリの停止ボタンを押したとき。各スレッドが中断され、キャッチに入り、エラーを出力し、さらに数回「ターン」続行してから中断することを期待します。残念ながらストップボタンを押すとキャッチに入らず、壊れません。実際、数値は加速しているように見えます。誰かが光を当てることができますか?Thread.interrupt(); の後でもスレッドが中断されないのはなぜですか? ありがとうございました!

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

        }
    }
}

}
4

2 に答える 2

3

が呼び出されるたびactionPerformed()に、新しいスレッドが作成されます。一度スレッドを作成し、それらの参照を保存する必要があります。

于 2013-02-14T05:21:31.677 に答える
1

問題はイベント処理プロセスだと思います。実際に停止を押しても、actioncommand は「開始」のままです。ラベルを設定する代わりに、使用してみてください

toggleButton.setActionCommand("Stop");

アクションコマンドの設定

于 2013-02-14T05:25:21.003 に答える