我如何在java中停止一个线程

时间:2013-03-26 17:39:58

标签: java multithreading netbeans

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

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

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

当我点击它时,itvstarts打印代码,但它似乎被阻止(按钮)。我想知道。我怎么能停止线程?如果我停止它,那么按钮会再次出现吗?。

我正在使用netbeans 7.3,谢谢。

4 个答案:

答案 0 :(得分:1)

while(true){
}

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

删除

答案 1 :(得分:0)

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

您需要为要执行的新线程提供一些代码。为此,您可以将线程传递给Runnable,也可以覆盖线程的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;
  }
}

答案 2 :(得分:0)

您没有停止 Java中的线程,您发送interrupt()信号。

线程可能或可能没有捕获信号。如果是waiting,或sleepingjoiningwait()sleep()或加入()),则{{3}将被提出。

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

答案 3 :(得分:0)

使用interrupt()。然后处理InterruptedException