2013-02-14 203 views
0

我想在Java中编写一个SlotMachine小程序。代码第一次工作,但是当我尝试第二次点击开始按钮时,程序崩溃。我知道这是线程中断和Thread.start();的问题。我试图实现一个布尔值“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) 
+0

其中是setVisible()方法? – 2013-02-14 06:50:22

+0

请包括完整的堆栈跟踪。 – 2013-02-14 06:51:21

+0

请解释为什么当代码不是一个小程序时,为什么您要将问题标记为“小程序”。 – 2013-02-14 06:53:09

回答

2

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

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

    } 

因为一旦线程停止,你不能再stat。所以你要么不让线程停下来,要么创建新线程。

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

2

如何停止一个线程,然后开始过来?

你不行。当一个线程终止时,它不能被重新启动。

您需要创建一个新线程并启动它,或者不让以前的线程停止。有关更完整的答案,请参阅链接的问题...