如何在java中停止线程



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

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

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

我正在使用netbeans 7.3,谢谢。

while(true){
}

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

删除

使用interrupt((。然后处理InterruptedException

您正在启动的线程没有执行任何操作。当您调用a.start()时,它开始并立即终止,因为没有可供该线程运行的代码。接下来,启动新线程并处理单击事件的同一线程将进入一个无限循环,因此您的用户界面将被完全阻塞。

您需要为新线程提供一些代码以便执行。为此,您可以向线程传递Runnable,也可以重写线程的run()方法。例如,要给它一个包含每2秒打印一次循环的Runnable,可以执行以下操作:

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;
  }
}

如果不停止Java中的线程,则会发送interrupt()信号。

线程可能捕捉到信号,也可能不捕捉到信号。如果是waiting,或者sleepingjoining(对其调用了wait()、sleep((或join(((,则将引发InterruptedException

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

相关内容

  • 没有找到相关文章