java - 启动线程时程序崩溃

标签 java multithreading user-interface

我正在尝试用 Java 编写一个 SlotMachine 小程序。该代码第一次可以正常工作,但是当我第二次尝试点击开始按钮时,程序崩溃了。我知道这是线程中断和 Thread.start(); 的问题。我尝试实现一个 boolean 值“isRunning”而不是中断,但这不起作用。如何停止线程然后重新启动它?一些见解会非常有帮助。谢谢!

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, result2, result3;
private Button toggleButton;
public static final int HEIGHT = 150;
public static final int WIDTH = 100;

box1Thread counter1Thread = new box1Thread();
box2Thread counter2Thread = new box2Thread();
box3Thread counter3Thread = new box3Thread();

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 {

    Random generator1 = new Random();

    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 randomInt1 = generator1.nextInt(75);
                for (int i = 0; i < randomInt1; i++) {
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e1) {
                        System.err.println("Interrupted.");
                    }
                    result1 = (count1++) % 4;
                    textWindow1.setText(Integer.toString(result1));
                }
                break;

            }
        }
    }
}

private class box2Thread extends Thread {

    Random generator2 = new Random();

    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 randomInt2 = generator2.nextInt(75);
                for (int i = 0; i < randomInt2; i++) {
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e1) {
                        System.err.println("Interrupted.");
                    }
                    result2 = (count2++) % 4;
                    textWindow2.setText(Integer.toString(result2));
                }
                break;
            }
        }
    }
}

private class box3Thread extends Thread {

    Random generator3 = new Random();

    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 randomInt3 = generator3.nextInt(75);
                for (int i = 0; i < randomInt3; i++) {
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e1) {
                        System.err.println("Interrupted.");
                    }
                    result3 = (count3++) % 4;
                    textWindow3.setText(Integer.toString(result3));
                }
                break;
            }
        }
    }
}

private class ToggleButtonListener implements ActionListener {

    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("Stop")) {

            counter1Thread.interrupt();
            counter2Thread.interrupt();
            counter3Thread.interrupt();
            toggleButton.setLabel("Wait");
            try {
                counter1Thread.join();
                counter2Thread.join();
                counter3Thread.join();
            } catch (InterruptedException e1) {
                System.err.println("Interrupted.");
            }
            if ((result1 == result2) && (result2 == result3)) {
                resultWindow.setText("You Win!");
            } else {
                resultWindow.setText("Sorry, You Lose!");
            }
            toggleButton.setLabel("Start");

        }

        else if (e.getActionCommand().equals("Start")) {

            counter1Thread.start();
            counter2Thread.start();
            counter3Thread.start();

            toggleButton.setLabel("Stop");
            resultWindow.setText("");

        }
    }
}

}

这是我收到的错误:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Unknown Source)
at SlotMachine$ToggleButtonListener.actionPerformed(SlotMachine.java:166)
at java.awt.Button.processActionEvent(Unknown Source)
at java.awt.Button.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

最佳答案

在您执行的操作中执行以下操作。

else if (e.getActionCommand().equals("Start"))
  {
    counter1Thread = new box1Thread();
    counter2Thread = new box2Thread();
    counter3Thread = new box3Thread();
    counter1Thread.start();
    counter2Thread.start();
    counter3Thread.start();

    toggleButton.setLabel("Stop");
    resultWindow.setText("");

  }

因为一旦线程停止,您就无法再次统计。因此,您要么不让线程停止,要么创建新线程。

在之前的代码中我正在创建新线程。

关于java - 启动线程时程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14869231/

相关文章:

java - 从 weblogic 迁移到 tomcat : directory mapping

ASP.NET 异步缓存

python - 如何在 Xvfb 中运行 Selenium?

java - 如何通过 if else 语句更改 Jbutton 图像?

java - 在 Java 中将线程对象添加到 JPanel

c++ - 当你在 Qt 中使用 setLayout 时,Layouts 会成为你的 child 吗

java - 为什么运行 android 2.3.4 和 android 1.6 模拟器会抛出不同的异常?

java - 子类和父类(super class)中的同名变量

java - 没有数据库的 Hibernate/JPA

c - 如何从另一个线程重新启动 posix 线程(在我的例子中是监视线程)