1

我目前在我的大学里上 Java 线程的课程,今天的练习是关于创建两个线程。 线程 A打印从 1 到 9 的随机数,没有休眠,线程 B从 1000 到 9999 打印 50 个休眠,这是一个无限循环,直到我决定按下停止按钮,它是一个中断两个线程的 JButton 。事情是,我在尝试用一个按钮停止线程时遇到了一些麻烦,主要是想找出如何解决它,以及如何为此目的创建一个 actionEvent。

这是我到目前为止的代码:

    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 个,因为它不是构造函数。我有点迷路了,所以我需要一些指导。任何帮助表示赞赏,非常感谢!

4

1 回答 1

4

您还没有将线程的实例传递到您的 GUI 中,而是为每个线程创建了两个单独的 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();
         }
      });
   }
}
于 2013-10-09T22:52:29.977 回答