ITEEDU

Java Gossip: 执行绪的停止

如果您想要停止一个执行绪的执行,当您查看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()方法,例如:

SomeThread.java
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....");
		}
	}
}
Main.java
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 模式。