我在一个按钮内用Java创建一个线程来打印一条简单的消息,但我无法阻止它。
Thread a = new Thread();
a.start();
while(true){
try{
Thread.sleep(2000);
System.out.println("code");
}catch(Exception e){
}
}
当我点击它时,itvstarts打印代码,但它似乎被阻止(按钮)。我想知道。我怎么能停止线程?如果我停止它,那么按钮会再次出现吗?。
我正在使用netbeans 7.3,谢谢。
答案 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
,或sleeping
或joining
(wait()
,sleep()或加入()),则{{3}将被提出。
Thread(在while循环中)可以通过调用InterruptedException
方法测试它是否被中断,然后决定自杀(例如退出循环)。
答案 3 :(得分:0)
使用interrupt()。然后处理InterruptedException