32-避免使用已弃用的方法
11.11 避免使用已弃用的方法
Java 并发API也有一些已弃用的操作。虽然API的第一版引入了这些操作,但是现在不应该继续使用它们了。新版的API实现了更佳的实践,已经取代了这些已弃用的操作。
Thread
类提供了如下一些危险的已弃用操作。
destroy()
:过去,这个方法用于销毁线程。实际上,它抛出一个NoSuchMethodError
。suspend()
:这个方法挂起线程的执行。stop()
:该方法强制结束线程。resume()
:该方法恢复已挂起线程的执行。
ThreadGroup
类也包含一些方法,具体如下所示。
suspend()
:这个方法挂起线程组中的所有线程。stop()
:这个方法强制结束线程组中的所有线程。resume()
:这个方法恢复线程组中所有已挂起线程的执行。
stop()
操作被弃用是因为它能够引发不一致错误。由于它强制结束线程,因此在操作完成之前,线程就可能结束,这将导致数据处于不一致的状态。如果一个线程正在修改银行账户,还没完成就停止了,那么这个银行账户将可能出现错误的数据。
stop()
也可能引发死锁。在调用它时,如果线程正处于同步机制(比如一个Lock)所保护的临界区内,那么同步机制将继续阻塞,没有其他线程能够进入这个临界区。这同样也是 suspend()
和 resume()
被弃用的原因。
作为这些操作的一种替代方案,可以使用一个存储了线程状态的内部属性,然后通过同步访问机制保护该属性,或者使用原子变量。在采取操作前必须检查该属性值,然后根据检查结果采取相应的操作。请注意要避免数据不一致和死锁问题,保证应用程序的正确性。