我在按钮内用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
,或者sleeping
或joining
(对其调用了wait()
、sleep((或join(((,则将引发InterruptedException
。
线程(在while循环中(可以通过调用isInterrupted()
方法来测试它是否被中断,然后决定自杀(例如退出循环(。