Java 线程后中断。中断()不起作用
下面的代码是为带有多线程的SlotMachine GUI编写的。当我按下应用程序中的停止按钮时。我希望每个线程都会被中断,进入catch,打印一个错误,再继续几圈,然后中断。不幸的是,当按下停止按钮时,它不会进入锁扣,也不会断开。事实上,数字似乎在加速。谁能帮我弄点光吗?为什么线程即使在Thread.interrupt()之后也不中断;?谢谢大家!Java 线程后中断。中断()不起作用,java,multithreading,user-interface,awt,event-dispatch-thread,Java,Multithreading,User Interface,Awt,Event Dispatch Thread,下面的代码是为带有多线程的SlotMachine GUI编写的。当我按下应用程序中的停止按钮时。我希望每个线程都会被中断,进入catch,打印一个错误,再继续几圈,然后中断。不幸的是,当按下停止按钮时,它不会进入锁扣,也不会断开。事实上,数字似乎在加速。谁能帮我弄点光吗?为什么线程即使在Thread.interrupt()之后也不中断;?谢谢大家! import java.awt.*; import java.awt.event.*; import java.util.Random; @Sup
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("");
}
}
}
}
import java.awt.*;
导入java.awt.event.*;
导入java.util.Random;
@抑制警告(“串行”)
公共类SlotMachine扩展框架{
私有文本字段textWindow1、textWindow2、textWindow3、resultWindow;
private int count1=0,count2=0,count3=0,result1=0,result2=0,
结果3=0;
专用按钮切换按钮;
公共静态最终内部高度=150;
公共静态最终整数宽度=100;
随机生成器=新随机();
公共静态void main(字符串[]args){
SlotMachine计数器窗口=新SlotMachine();
计数器窗口。设置为可见(true);
}//主要
公共SlotMachine(){
设置尺寸(宽度、高度);
addWindowListener(新的WindowDestroyer());
setTitle(“老虎机”);
挫折背景(橙色);
setLayout(新的FlowLayout());
textWindow1=新的TextField(1);
添加(文本窗口1);
textWindow1.setText(“*”);
textWindow2=新的TextField(1);
添加(文本窗口2);
textWindow2.setText(“*”);
textWindow3=新的TextField(1);
添加(文本窗口3);
textWindow3.setText(“*”);
toggleButton=新按钮(“开始”);
addActionListener(新的ToggleButtonListener());
添加(切换按钮);
resultWindow=新文本字段(10);
添加(结果);
resultWindow.setText(“”);
}
私有类box1Thread扩展线程{
公开募捐{
while(true){
试一试{
睡眠(50);
结果1=(count1++)4;
textWindow1.setText(Integer.toString(result1));
}捕捉(中断异常e){
System.err.println(“中断”);
int randomInt=generator.nextInt(25);
对于(int i=0;i
每次调用actionPerformed()
时,您都在创建新线程。您需要创建一次线程并保存这些引用。我认为问题在于事件处理过程。实际上,当您按stop时,actioncommand仍处于“开始”状态。
不要设置标签,而是尝试使用
toggleButton.setActionCommand("Stop");
为什么在2013年,该代码使用上一个千年的组件?为什么不使用Swing?顺便说一句,这与“小型应用程序”的一般含义无关。我只是注意到太=P了