0

我在一个按钮内用 Java 创建了一个线程来打印一条简单的消息,但我无法停止它。

Thread a = new Thread();
a.start();

while(true){
    try{
        Thread.sleep(2000);
        System.out.println("code");
    }catch(Exception e){
    }
}

当我点击它时,它开始打印代码,但它似乎被阻止(按钮)。我想知道。我怎样才能停止线程?如果我停止它,按钮会再次可用吗?

我正在使用 netbeans 7.3,谢谢。

4

4 回答 4

1
while(true){
}

启动一个无限循环,因此所有其他操作都被阻塞。

删除那个

于 2013-03-26T17:41:42.797 回答
0

Use interrupt(). Then handle the InterruptedException

于 2013-03-26T17:47:24.700 回答
0

您正在启动的线程没有做任何事情。它在您调用时启动a.start()并立即终止,因为该线程没有运行代码。在此之后,启动新线程并处理点击事件的同一线程进入无限循环,因此您的用户界面被完全阻塞。

您需要为新线程执行一些代码。为此,您可以传递线程 aRunnable或覆盖线程的run()方法。例如,要给它一个Runnable包含每 2 秒打印一次的循环,您可以这样做:

final Thread a = new Thread(new Runnable() {
  @Override public void run() {
    while (true) {
      try {
        Thread.sleep(2000);
        System.out.println("code");
      } catch (InterruptedException e) {
        break;
      }
    }
  }
};
a.start();

之后,如果您想停止该线程,则需要a在字段或其他内容中保存对该线程的引用,然后调用a.interrupt(). 这将导致sleep抛出一个InterruptedException,它将被捕获并执行break,这将终止无限循环并允许线程到达run方法的末尾,从而终止线程。

例如:

private Thread a = null;
... click handler on start button ... {
  if (a == null) {
    a = new Thread(new Runnable() {
      @Override public void run() {
        while (true) {
          try {
            Thread.sleep(2000);
            System.out.println("code");
          } catch (InterruptedException e) {
            break;
          }
        }
      }
    };
    a.start();
  }
}

... click handler on "stop" button ... {
  if (a != null) {
    a.interrupt();
    a = null;
  }
}
于 2013-03-26T17:44:02.907 回答
0

您不会停止Java 中的线程,而是发送interrupt()信号。

线程可能会,也可能不会捕捉到信号。如果它是waiting, or sleepingor joining( wait(), sleep()或 join()) 已被调用),InterruptedException将引发 an。

线程(在其while循环中)可以通过调用该方法来测试它是否被中断isInterrupted(),然后决定自杀(例如退出循环)。

于 2013-03-26T17:47:01.540 回答