过期的suspend,resume,stop

方法介绍

  1. suspend():暂停任务
  2. resume():恢复任务
  3. stop():停止任务

 

stop()

当调用stop()方法时会发生两件事:

  1. 即刻停止run()方法中剩余的全部工作,包括在catch或finally语句中,并抛出ThreadDeath异常(通常情况下此异常不需要显示的捕获),因此可能会导致一些清理性的工作的得不到完成,如文件,数据库等的关闭。

  2. 会立即释放该线程所持有的所有的锁,导致数据得不到同步的处理,出现数据不一致的问题。

suspend()和resume()必须要成对出现,否则非常容易发生死锁。

这两个操作就好比播放器的暂停和恢复。

不推荐使用suspend()去挂起线程的原因,是因为suspend()在导致线程暂停的同时,并不会去释放任何锁资源。其他线程都无法访问被它占用的锁。直到对应的线程执行resume()方法后,被挂起的线程才能继续,从而其它被阻塞在这个锁的线程才可以继续执行。

interrupt() 与 cancel()的区别

   两者实际上都是中断线程,但是后者更安全、有条理和高效,其原因跟推荐使用Executor而不直接使用Thread类是一致的。所以结合上面讲到的原则,我们应尽量采用cancel()方法,调用线程管理器ExecutorService接口的submit(Runnable task) 方法会返回一个Future<?>对象,然后调用Future.cancel()的方法来取消任务,并返回一个boolean值。

 

 

不再使用的原因

  • suspend()方法在调用后,线程不会释放已经占有的资源,而是占用着资源进入睡眠状态,这样容易引发死锁问题。
  • stop()方法在终止一个线程时并不会保证线程的资源能够正常释放。通常是没有给予线程完成资源释放工作的机会,因此会导致程序可能工作在不确定的状态下

posted on 2020-08-13 09:46  shumeigang  阅读(249)  评论(0)    收藏  举报

导航