如果您想要停止一个执行绪的执行,当您查看API时,您会发现Thread的stop()方法已经被标示为 "deprecated",使用这个方法来停止一个执行绪是不被建议的。
请见:Why Are Thread.stop,
Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated?
如果您想要停止一个执行绪,您最好自行实作。
一个执行绪要进入Dead状态,就是执行完run()方法,简单的说,如果您想要停止一个执行绪的执行,就要提供一个方式让执行绪可以执行完run(),而这也是您自行实作执行绪停止的基本概念。
例如,如果执行绪的run()方法中执行的是一个重复执行的循环,您可以提供一个flag来控制循环是否执行,藉此让循环有可能终止、执行绪可以离开 run()方法以终止执行绪:
public class SomeThread implements Runnable {
private boolean isContinue = true;
public void terminate() {
isContinue = false;
}
public void run() {
while(isContinue) {
// ... some statements
}
}
}
如果执行绪因为执行sleep()或是wait()而进入Not Runnable状态,而您想要停止它,您可以使用interrupt(),而程序会丢出InterruptedException例外,因而使得执行绪 离开run()方法,例如:
package onlyfun.caterpillar;
public class SomeThread implements Runnable {
public void run() {
System.out.println("sleep....going to not runnable");
try {
Thread.sleep(9999);
}
catch(InterruptedException e) {
System.out.println("I am interrupted....");
}
}
}
package onlyfun.caterpillar;
public class Main {
public static void main(String[] args) {
Thread thread = new Thread(new SomeThread());
thread.start();
thread.interrupt();
}
}
如果程序因为I/O而停滞,进入Not Runnable状态,基本上您必须等待I/O完成才能离开Not Runnable,您无法使用interrupt()来使得执行绪离开run()方法,您要提供替代的方法,基本上的概念也是引发一个例外,而这个例外要 如何引发,要看您所使用的I/O而定,例如您使用readLine()在等待网络上的一个讯息,此时执行绪进入Not Runnable直到读到一个讯息,您要让它离开run()的方法就是使用close()关闭它的串流,这时会引发一个IOException例外而使得 执行绪离开run()方法,例如:
public class Client implements Runnable {
private Socket skt;
// .....
public void terminate() {
skt.close();
}
public void run() {
// .....
try {
BufferedReader buf = new BufferedReader(
new InputStreamReader(skt.getInputStream()));
// 读取客户端讯息
// 执行readLine()会进入Not runnable状态
// 直到读到客户端讯息
while((userMessage = buf.readLine()) != null) {
// ....
}
}
catch(IOException e) {
System.out.println("执行绪被终止.......");
}
}
}
上面这个程序是个简单的架构示范,实际的设计必须视您的程序功能与I/O类型而定。
除了stop()之外,suspend()、resume()方法也被标示为"deprecated",这些方法如果您要达成相同的功能,您都必须自行实作,在将来新的Java版本中如果这些功能被实现,它也可能是新的接口,而不是使用现有的方法。
有关于执行绪的终止,还可以参考 Two-phase Termination
模式。