我有以下主题:
public void start() {
isRunning = true;
if (mainThread == null) {
mainThread = new Thread(this);
mainThread.setPriority(Thread.MAX_PRIORITY);
}
if (!mainThread.isAlive()) {
try {
mainThread.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
在某些时候我想停止它的操作:
public void stop() {
isRunning = false;
System.gc();
}
再次调用start()
时会抛出以下异常:
java.lang.IllegalThreadStateException
指向mainThread.start()
代码行。
启动/停止线程的最佳方法是什么?我怎样才能使这个线程可重用?
谢谢!
答案 0 :(得分:6)
一旦线程停止,你无法在Java中重启,但当然你可以用Java创建一个新的线程来完成你的新工作。
即使您创建新线程或重新启动相同的线程,用户体验也不会有所不同(这是您在Java中无法做到的)。
您可以阅读网站了解API规范http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html
您可能正在寻找的是Interrupts
。中断是一个线程的指示,它应该停止正在做的事情并做其他事情。由程序员决定线程如何响应中断,但线程终止是很常见的。
要了解有关中断的更多信息,请阅读Java教程指南http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
答案 1 :(得分:1)
在您的代码片段中,您似乎使用的Runnable
类具有Thread
属性。您可以使用下面的暂停/恢复,而不是使用停止/启动:
private boolean isPaused;
public void run() {
while (!isRunning) {
// do your stuff
while (isPaused) {
mainThread.wait();
}
}
}
public void suspend() {
isPaused = true;
}
public void resume() {
isPaused = false;
mainThread.notify();
}
我没有添加synchronized
块来保持代码较小,但您需要添加它们。