给出了一个Runnable:
public class MyRunnable implements Runnable {
public void run() {
doA();
for (i=0; i<18123 ; i++) {
doB();
}
doC();
}
}
其中doA,B,C各自定义了100行代码。
使线程FREEZE的最佳方法是什么 - 在它所处的任何代码行中 - 然后从它最后停止的下一行代码继续。
我正在网上搜索,我在这里看到http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html 他们建议使用布尔值,那么,这是否意味着我需要在每几行代码后检查该布尔值?有一个更好的方式......
答案 0 :(得分:2)
对于原因Thread.suspend()
和Thread.resume()
已弃用,一般情况下无效:
Thread.suspend本身就容易出现死锁。如果目标线程在监视器上保持锁定,在挂起时保护关键系统资源,则在恢复目标线程之前,任何线程都无法访问此资源。如果恢复目标线程的线程在调用resume之前尝试锁定此监视器,则会导致死锁。这种死锁通常表现为“冻结”过程。
如果你绝对需要这种行为,你必须自己明确地实现它。
实现可以看起来像这样(代码没有经过测试,也没有编译过):
public abstract class SafeStoppableRunnable implements Runnable { private boolean stopped = false; public synchronized void stopSafe() { this.stopped = true; } public synchronized void resumeSafe() { this.stopped = false; synchronized(this) { this.notifyAll(); } } protected synchronized void waitWhenStopped() { while(this.stopped) { this.wait(); } } }
可停止的Runnable
应该延伸SafeStoppableRunnable
,并在您希望程序可以停止的程序中的所有点调用方法waitWhenStopped()
。可停止的点可能是程序不能保存其他线程需要进行的全局资源的点。
答案 1 :(得分:2)
多线程系统非常复杂。多线程编程的黄金法则是避免任何代码,这些代码可能会提高系统的熵级别。模糊的系统状态是不可能预测和追踪的。
在一些不可预测的线上暂停的线程是多线程程序员的噩梦。在开发时,在线程被某个未知线路唤醒后,根本不可能确保系统正常工作。你无法跟踪所有的选择。这将100%导致生产中出现各种奇怪的缺陷。
在线程中添加几个明确的暂停点是唯一的方法。