下面的代碼用於帶有MultiThreads的SlotMachine GUI。當我點擊應用程序中的停止按鈕時。我希望每一個線程都會被打斷,進入catch,打印一個錯誤,繼續進行幾次「轉身」然後休息。不幸的是,當停止按鈕被擊中時,它不會進入捕捉並且不會中斷。它實際上似乎是數字加速。有人可以擺脫一些光?爲什麼線程在Thread.interrupt()之後不會中斷?謝謝!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("");
}
}
}
}
爲什麼在2013年是使用近千年的組件的代碼?爲什麼不使用Swing?順便說一句 - 這與「小應用程序」的通用含義超出了[tag:applet]無關。 – 2013-02-14 05:26:25