请教关于多线程
为什么多线程里的thread的 stop suspend resume都被sun声明为不赞成使用
那我要实现线称的挂起,停止,重新运行等操作应该怎么进行呢?
谢谢各位指教!
------解决方案--------------------从api文档里看的:
stop()方法具有固有的不安全性。用 Thread.stop 来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查 ThreadDeath 异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任意的行为。stop 的许多使用都应由只修改某些变量以指示目标线程应该停止运行的代码来取代。目标线程应定期检查该变量,并且如果该变量指示它要停止运行,则从其运行方法依次返回。如果目标线程等待很长时间(例如基于一个条件变量),则应使用 interrupt 方法来中断该等待。
而suspend resume有死锁倾向
同样的功能可以用wait 和notify/notifyAll实现,不过建议用notifyAll,因为notify唤起的线程是不确定的
------解决方案--------------------楼上说的不错,我来详细解释一下:
1. stop()方法,作用是终止所有未结束的方法,包括run()方法。而当一个线程停止时,会释放所有他锁住对象的锁。举个例子:假设你设计一个线程从A的帐户里转帐给B,为了确保安全性,会用到锁,假设当钱从A的帐户取出来而又没有转到B帐户的时候调用stop()方法将线程停止,这时对象的状态将会出现不一致。因此,我们不知道何时调用stop()方法才是安全的,所以不建议使用。
2. suspend()方法,作用是阻塞线程,将线程的状态变为Blocked,而只有另一个线程调用resume()方法时该线程才会重新启动。但是所有线程都调用suspend()方法将全部挂起,从而导致死锁。所以suspend()方法不建议使用,而resume()当然也就没用了!
正确的方法是 interrupt(),发送一个中断请求给一个线程,将中断状态设为true,当该线程状态为阻塞时会抛出一个InterruptedException异常。而检查一个线程是否被终止应该使用isinterrupted()方法。