-1

Следующий код для графического интерфейса SlotMachine с MultiThreads. Когда я нажимаю кнопку остановки в приложении. Я ожидал бы, что каждый поток будет прерван, перейдем к улову, напечатаем ошибку, продолжим еще несколько «поворотов», затем перерыв. К сожалению, когда нажата кнопка остановки, она не попадает в ловушку и не ломается. На самом деле кажется, что цифры ускоряются. Может кто-то пролить свет? Почему потоки не прерываются даже после 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? BTW - это не имело никакого отношения к [tag: applet] за общим значением «малого приложения». –

ответ

3

всякий раз, когда вызывается actionPerformed(), вы создаете новые темы. вам нужно создать потоки один раз и сохранить эти ссылки.

+0

Я просто заметил, что тоже = P – Jason

1

Я думаю, что проблема заключается в обработке событий. Фактически, когда вы нажимаете stop, actioncommand все еще находится в «Start». Вместо установки метки, попробуйте использовать

toggleButton.setActionCommand("Stop"); 

Set actioncommand

Смежные вопросы