-1

下面的代碼用於帶有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(""); 

     } 
    } 
} 

} 
+0

爲什麼在2013年是使用近千年的組件的代碼?爲什麼不使用Swing?順便說一句 - 這與「小應用程序」的通用含義超出了[tag:applet]無關。 – 2013-02-14 05:26:25

回答

3

每次調用actionPerformed()時,您正在創建新線程。您需要創建一次線程並保存這些引用。

+0

我剛剛注意到這一點= P – Jason 2013-02-14 05:29:36

1

我認爲問題是事件處理過程。實際上當你按停止,actioncommand仍然在「開始」。 而不是設置標籤,請嘗試使用

toggleButton.setActionCommand("Stop"); 

Set actioncommand