如何正确停止线程?
您的每一个用心回答,都会让这个世界变得更美好一些!
1.正常运行结束指线程体执行完成,线程自动结束。
2.使用退出标志退出线程在一般情况下,在run方法执行完毕时,线程会正常结束。然而,有些线程是后台线程,需要长时间运行,只有在系统满足某些特殊条件后,才能触发关闭这些线程。这时可以使用一个变量来控制循环,比如设置一个boolean类型的标志,并通过设置这个标志为true或false来控制while循环是否退出
3.使用interrupt方法终止线程有以下两种情况。
(1)线程处于阻塞状态。例如,在使用了sleep、调用锁的wait或者调用socket的receiver、accept等方法时,会使线程处于阻塞状态。在调用线程的interrupt方法时,会抛出InterruptException异常。我们通过代码捕获该异常,然后通过break跳出状态检测循环,可以有机会结束这个线程的执行。通常很多人认为只要调用interrupt方法就会结束线程,这实际上理解有误,一定要先捕获InterruptedException异常再通过break跳出循环,才能正常结束run方法。
(2)线程未处于阻塞状态。此时,使用isInterrupted方法判断线程的中断标志来退出循环。在调用interrupt方法时,中断标志会被设置为true,并不能立刻退出线程,而是执行线程终止前的资源释放操作,等待资源释放完毕后退出该线程。
4.使用stop方法终止线程:不安全在程序中可以直接调用Thread.stop方法强行终止线程,但这是很危险的,就像突然关闭计算机的电源,而不是正常关机一样,可能会产生不可预料的后果。
问题没问清楚,是到阻塞 还是到销毁?
阻塞
.sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
.wait()方法,JVM 会把该线程放入等待队列(waitting queue)
中。释放锁
销毁:
stop()方法来结束该线程—该方法通常容易导致死锁,不推荐使用。
1.正常运行结束指线程体执行完成,线程自动结束。
2.使用退出标志退出线程在一般情况下,在run方法执行完毕时,线程会正常结束。然而,有些线程是后台线程,需要长时间运行,只有在系统满足某些特殊条件后,才能触发关闭这些线程。这时可以使用一个变量来控制循环,比如设置一个boolean类型的标志,并通过设置这个标志为true或false来控制while循环是否退出
3.使用interrupt方法终止线程有以下两种情况。
(1)线程处于阻塞状态。例如,在使用了sleep、调用锁的wait或者调用socket的receiver、accept等方法时,会使线程处于阻塞状态。在调用线程的interrupt方法时,会抛出InterruptException异常。我们通过代码捕获该异常,然后通过break跳出状态检测循环,可以有机会结束这个线程的执行。通常很多人认为只要调用interrupt方法就会结束线程,这实际上理解有误,一定要先捕获InterruptedException异常再通过break跳出循环,才能正常结束run方法。
(2)线程未处于阻塞状态。此时,使用isInterrupted方法判断线程的中断标志来退出循环。在调用interrupt方法时,中断标志会被设置为true,并不能立刻退出线程,而是执行线程终止前的资源释放操作,等待资源释放完毕后退出该线程。
4.使用stop方法终止线程:不安全在程序中可以直接调用Thread.stop方法强行终止线程,但这是很危险的,就像突然关闭计算机的电源,而不是正常关机一样,可能会产生不可预料的后果。
问题没问清楚,是到阻塞 还是到销毁?
阻塞
.sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
.wait()方法,JVM 会把该线程放入等待队列(waitting queue)
中。释放锁
销毁:
stop()方法来结束该线程—该方法通常容易导致死锁,不推荐使用。