1、使用sleep()方法暂停线程执行
说明:Thread.sleep()使当前线程的执行暂停一段指定时间,使得其他线程或者执行在当前计算机上的其他进程。
该方法不会放弃除CPU外的其他资源。sleep有两个重载版本,一个以毫秒为单位指定睡眠时间、另外
一个以纳秒为单位指定睡眠时间。但并不保证时间的精确。另外中断(interrupt)可以终止线程睡眠,所
以在任何时候都不能假设线程会睡眠指定时间。
注意:sleep方法声明可以抛出InterruptedException异常,当另一个线程中断了已经处于睡眠(sleep)的线程时
就会抛出InterruptedException异常。
2、使用join()方法等待另外一个线程结束
说明:join方法让一个线程等待另外一个线程完成。例如有两个线程T1和T2,当在T1中执行T2.join(),会导致T1暂
停当前线程等待T2线程的终止。同样join方法有两个重载的方法,join的另外一个重载版本允许线程等待指
定时间。跟sleep方法一样,这里的时间是不精确的。
3、使用interrupt()方法取消线程
说明:已经启动的线程是活跃的,即isAlive()方法返回true,线程终止之前一直是活跃的。有三种方法可以使线程
终止:1)run方法正常返回;2)run方法意外终止;3)应用程序终止。
我们可以通过中断(interrupt)方法来请求取消线程,并让线程自己来监控并响应中断。中断请求通常是用
户希望能够终止线程的执行,但是并不会强制线程的终止,但是它会中断线程的睡眠状态,比如调用sleep()
和wait()方法后。
线程自己检查中断状态并终止线程比直接调用stop()方法更安全,因为线程可以保存状态。并且stop()方法已
经不推荐使用。
与中断线程相关的方法:1)interrupt,向线程发出中断请求;2)isInterrupted,测试线程是否已经被中断;
3)Interrupted,测试当前线程是否已经被中断,然后清除线程的“中断”状态的静态方法。
线程的中断状态只能有线程自己清除,当线程侦测到自己被中断时,经常需要再响应中断前做一些清除工作,
这些清除工作可能涉及哪些在线程仍然保持中断状态时会受影响的操作。
如果被中断的线程正在执行sleep或者wait方法时,就会抛出InterruptedException异常。这种抛出异常的中断
会清除线程的中断状态。
大体上线程的中断操作都应该通过interrupt来取消阻塞操作。
4、使用stop()方法终止线程
说明:在Thread类中提供stop()方法强迫线程停止执行,但是已经过时了。该方法具有固有的不安全性。用stop()方
法终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查的ThreadDeath异常的自然结果)
。如果以前受这些监视器的保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有
可能导致任意的行为。stop的使用方式都应该由只修改某些变量以指示目标线程应该停止运行的代码来替代。
目标线程应该定期检查这些变量,并且如果这些变量指示它停止运行,则从其执行方式依次返回。如果目标线
程等待很长时间(例如基于一个条件变量),则应使用interrupt方法来中断该等待。