Java 通过单击按钮启动和停止线程

Java 通过单击按钮启动和停止线程,java,multithreading,user-interface,infinite-loop,Java,Multithreading,User Interface,Infinite Loop,简单地说,我有两个类,一个GUI类,它有一个按钮,用于停止和运行另一个类/线程,用于从剪贴板获取文本内容并将其粘贴到文本文件。但无论我尝试了什么(比如使用swingworker),我都无法实现我的目标。该代码可以启动线程,但会冻结GUI。我尝试使用SwingWorker,但失败了。请给我一个解决办法 class GUI { Thread a = null; JButton onOffButton; onOffButt.addActionListener(new ActionList

简单地说,我有两个类,一个GUI类,它有一个按钮,用于停止和运行另一个类/线程,用于从剪贴板获取文本内容并将其粘贴到文本文件。但无论我尝试了什么(比如使用swingworker),我都无法实现我的目标。该代码可以启动线程,但会冻结GUI。我尝试使用SwingWorker,但失败了。请给我一个解决办法

class GUI
{
  Thread a = null;

  JButton onOffButton;
  onOffButt.addActionListener(new ActionListener()
  {
        @Override
        public void actionPerformed(ActionEvent arg0)
        {
            if (a == null)
            {
                isOn = true;
                onOffButt.setText("on");
                onOffButt.setBackground(Color.green);

                a = new Thread(new TextHandler());
                a.start();
            }
            else    
            {
                isOn = false;
                onOffButt.setText("off");
                onOffButt.setBackground(Color.red);

                a.interrupt();
                a = null;
            }
        }
    });
}


class TextHandler() extends Thread
{
   run()
    {
      for(;;)
      {
        // getClipboardContent();
        // evaluate
        // paste
      }
   }
}

在您的
文本处理程序
中,您在哪里做任何事情,比如睡觉,以捕获
中断异常
?如果不这样做,中断位将被提升,但您将永远看不到它。如果您没有执行任何可能会注意到线程已中断的操作,则可以将其添加到循环中:

for(;;)
{
    // getClipboardContent();
    // evaluate
    // paste
    if (Thread.currentThread().interrupted())
    {
        break;
    }
}

我试过你的建议,但还是有同样的错误。java.lang.InterruptedException:sleep interrupted at java.lang.Thread.sleep(本机方法)at TextHandler.run(TextHandler.java:85)at java.lang.Thread.run(未知源)它应该给出一个中断异常,因为这就是中断thredI所看到的。但是它没有帮助。所以,如果你已经有了
睡眠
,并且它抛出了一个
中断异常
,为什么你不捕获异常并打破循环呢?