本文主要是介绍过期的suspend,resume 和stop,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
方法介绍
- suspend():暂停任务
- resume():恢复任务
- stop():停止任务
stop()
当调用stop()
方法时会发生两件事:
-
即刻停止
run()
方法中剩余的全部工作,包括在catch或finally语句中,并抛出ThreadDeath异常(通常情况下此异常不需要显示的捕获),因此可能会导致一些清理性的工作的得不到完成,如文件,数据库等的关闭。 -
会立即释放该线程所持有的所有的锁,导致数据得不到同步的处理,出现数据不一致的问题。
suspend()和resume()必须要成对出现,否则非常容易发生死锁。
这两个操作就好比播放器的暂停和恢复。
不推荐使用suspend()
去挂起线程的原因,是因为suspend()
在导致线程暂停的同时,并不会去释放任何锁资源。其他线程都无法访问被它占用的锁。直到对应的线程执行resume()
方法后,被挂起的线程才能继续,从而其它被阻塞在这个锁的线程才可以继续执行。
interrupt() 与 cancel()的区别
两者实际上都是中断线程,但是后者更安全、有条理和高效,其原因跟推荐使用Executor而不直接使用Thread类是一致的。所以结合上面讲到的原则,我们应尽量采用cancel()方法,调用线程管理器ExecutorService接口的submit(Runnable task) 方法会返回一个Future<?>对象,然后调用Future.cancel()的方法来取消任务,并返回一个boolean值。
不再使用的原因
- suspend()方法在调用后,线程不会释放已经占有的资源,而是占用着资源进入睡眠状态,这样容易引发死锁问题。
- stop()方法在终止一个线程时并不会保证线程的资源能够正常释放。通常是没有给予线程完成资源释放工作的机会,因此会导致程序可能工作在不确定的状态下
这篇关于过期的suspend,resume 和stop的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!