暂停Java上的线程

时间:2012-02-11 23:46:19

标签: java multithreading

给出了一个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 他们建议使用布尔值,那么,这是否意味着我需要在每几行代码后检查该布尔值?有一个更好的方式......

2 个答案:

答案 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%导致生产中出现各种奇怪的缺陷。

在线程中添加几个明确的暂停点是唯一的方法。