您正在启动的线程没有做任何事情。它在您调用时启动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;
}
}