使用stop()方法停止线程则是非常暴力的。
调用stop方法时会抛出java.lang.ThreadDeath异常,但在通常情况下,此异常不需要显示地捕捉。
使用stop释放锁将会给数据造成不一致性的后果。
将方法interrupt()和ruturn结合使用也能实现停止线程的效果。
不过还是建议使用“抛异常”法来实现线程的停止,因为在catch块中可以对异常进行相关的处理,而且使用异常流能更好、更方便地控制程序的运行流程,不至于代码中出现很多个return;造成污染。
暂停线程
暂停线程意味着线程可以恢复运行。在java多线程中,可以使用suspend()方法暂停线程,使用resume()方法恢复线程的执行。
suspend与resume方法的缺点--独占
在使用suspend与resume方法时,如果使用不当,极易造成公共的同步对象的独占,使得其他线程无法访问公共同步对象。
/**
* Prints an integer and then terminate the line. This method behaves as
* though it invokes <code>{@link #print(int)}</code> and then
* <code>{@link #println()}</code>.
*
* @param x The <code>int</code> to be printed.
*/
public void println(int x) {
synchronized (this) {
print(x);
newLine();
}
}
println()方法内部是同步的。
suspend与resume方法的缺点--不同步
使用这两个方法是也容易出现因为线程的暂停而导致数据不同步的情况。
yield方法
yield()方法的作用是放弃当前的CPU资源,将它让其他的任务去占用CPU执行时间。但放弃的时间不确定,有可能刚刚放弃,马上又获得CPU时间片。
注释掉yield()方法,cup独占。用时16ms
放开yield()方法,将CPU让给其他资源导致速度变慢。用时3847ms