2013-10-09 3 views
1

В настоящее время у меня есть уроки о Java-потоках в моем колледже, и сегодняшнее упражнение состояло в создании двух потоков. нитяного печатает случайные числа от 1 до 9, без сна и Thread B от 1000 до 9999 с 50 сном, это бесконечный цикл, пока я не решил нажать кнопку остановки которая является JButton, что прерывания оба потока. Дело в том, что у меня возникли проблемы с попыткой остановить потоки с помощью одной кнопки и в основном пытаться выяснить, как это работает, и как создать ActionEvent для этой цели.Прерывающие потоки с JButton

Это код, который я до сих пор:

import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    import javax.swing.JButton; 
    import javax.swing.JFrame; 

public class RandomNumbers extends Thread { 
    long time; 
    long min; 
    long max; 
    private JFrame window; 
    private JButton stopButton; 

    public RandomNumbers(long min, long max, long time) { 
     this.min = min; 
     this.max = max; 
     this.time = time; 
     new Window(); 
    } 

    public void run() { 
     try { 
      while (true) { 
       System.out.println((int) ((Math.random() * max) + min)); 
       Thread.sleep(time); 
      } 
     } catch (Exception e) { 
      System.out.println("I was interrupted!"); 
     } 
    } 

    public class Window { 
     public Window() { 
      window = new JFrame("Stop Button"); 
      stopButton = new JButton("Stop"); 
      stopButton.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent arg0) { 
        // ThreadA.interrupt(); //problem in here , what to do ? //**** 
        // ThreadB.interrupt(); 

       } 
      }); 

      window.getContentPane().add(stopButton); 
      window.setSize(100, 100); 
      window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      window.setVisible(true); 
     } 
    } 

    public static void main(String[] args) throws InterruptedException { 

     Thread threadB = new RandomNumbers(1, 9, 50); 
     Thread threadA = new RandomNumbers(1000, 8999, 0); 
     threadB.start(); 
     threadA.start(); 
    } 
} 

Кроме того, есть еще одна проблема, на этом коде, где он будет создавать 2 стоп-кнопки, 1 для каждого потока, так как это не конструктор .. Я немного потерян, поэтому мне нужно руководствоваться здесь. Любая помощь приветствуется, спасибо большое!

+0

Вы создаете два потока, и каждый поток создает окно. Так что приземлишься на два окна. Кроме того, для отладки будет полезно узнать имя текущего потока: 'System.out.println (Thread.currentThread(). GetName() +": "+ (int) ((Math.random() * max) + мин)); – flup

ответ

4

Вы не передали экземпляр своей нити в свой графический интерфейс, а создаете два отдельных файла GUI для каждого потока, который немного запутан. Держите отдельные части программы отдельно, возможно, в отдельных классах. Например:

  • создать класс MyRunnable, который реализует Runnable и выполняет частичную обработку кода.
  • Создайте массив из них для своей основной программы/GUI.
  • Создайте массив потоков для запуска Runnables.
  • Затем в ActionListener прервите свои потоки.

например. (только часть GUI),

public class ThreadTest extends JPanel { 
    private JButton button = new JButton(new ButtonAction()); 
    private MyRunnable[] runnables = { 
     new MyRunnable("thread 1", 1, 9, 50), 
     new MyRunnable("thread 2", 1000, 8999, 1) }; 
    private Thread[] threads = new Thread[runnables.length]; 

    public ThreadTest() { 
     add(button); 
     for (int i = 0; i < threads.length; i++) { 
     threads[i] = new Thread(runnables[i]); 
     threads[i].setName(runnables[i].getName()); 
     threads[i].start(); 
     } 
    } 

    private class ButtonAction extends AbstractAction { 
     public ButtonAction() { 
     super("Stop Threads"); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     for (Thread thread : threads) { 
      if (thread != null && thread.isAlive()) { 
       thread.interrupt(); 
      } 
     } 
     } 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("ThreadTest"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new ThreadTest()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
Смежные вопросы