1中断线程
当线程的run方法执行到最后一句,或者执行return语句返回,或者出现没有捕获的异常的时候,线程将终止。看API中早期的stop方法已经过时了,所以弃用它。
Thread.interrupt方法只是用来请求终止一个线程,对正在运行的线程只是将中断的标记置为true,对于阻塞的线程来说,只是让阻塞尽快结束。
当调用Thread.interrupt方法时,如果线程正在运行,这个方法只是将中断状态置为true ,不能真正的停止一个正在运行的线程。但是可以通过判断这个标记来终止一个线程。例如while(!Thread.currentThread().isInterrupted){
do something
}
对于线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个InterruptedException异常。这个时候,我们可以通过捕获 InterruptedException异常来终止线程的执行,具体可以通过return等退出或改变共享变量的值使其退出。
2线程的中断和停止
Thread.interrupt()方法是让一个线程中断,对于正在运行的线程,只是做了一个标记,将中断置置为true,对于阻塞的线程,抛出InterruptedException,并把中断标记置为false.
对于下面的代码
void myTask{
...
try{
sleep(delay)
}catch(InterruptedException e){
}
...
}
这段代码是没有更大的意义的,因为捕获到异常之后中断标记被置为false了
最好采用下面的两种方法来实现,
void myTask{
...
try{
sleep(delay)
}catch(InterruptedException e){
Thread.currentThread().inturrept();/设置状态,/调用的人可以对它进行检测
}
...
}
或者直接抛出异常是最好的方式
void myTask throws InterruptedException{
...
sleep(delay);
...
}
3如果要终止线程,最好的办法是通过通过共享变量中断线程,停止线程的执行。