暂停和恢复方法

时间:2012-05-13 12:06:49

标签: java multithreading

我遇到了一些暂停和恢复方法的麻烦。 (在Eclipse中使用Java)。

基本上我正在编写一个有点像编译器的程序。我给它一个字符串,它解释这个字符串,在一个n个命令,条件和循环(取决于强)之类的东西中转换它并执行这些命令。像这样:

(while 
  (energy-at-least 1000)
  (seq
    (move) 
    (turn clockwise)
  )
)

目前我有一个在第N个命令停止的方法,但我不确定如何在此之后继续,因为重复使用此方法并告诉它从第N + 1个命令启动它会忘记程序在环(一个或多个)。

对于糟糕的解释感到抱歉,但基本上我需要能够在第N个命令停止此方法并让它从它所遵循的课程中恢复。 Java有这些方法(resume()和stop())但是我已经看过它们已被弃用了。有人有个好主意吗?

4 个答案:

答案 0 :(得分:0)

执行此操作的简单方法是使用wait()和notify()方法。当然,它将取决于你将运行多少并行线程,因为notify()方法不能保证你实际唤醒哪个线程。

答案 1 :(得分:0)

根据我的理解你的说法是你需要对线程中的循环进行更精细的控制,然后像'notify','resume'等方法提供。你可以做这样的事情:

线程的类可能如下所示:

public WhateverLoop implements Runnable {
    private volatile boolean run = true;

    public void run() {
        while(run) {
            doWhatever();
        }        
    }

    public setRun(boolean run) {
        this.run = run;
    }
}

'易变'部分非常重要。它使其他线程能够影响'run'变量(基本上它可以防止线程将它复制到自己的内存中)。否则,从其他线程到变量的更改将在线程中不可见。

控制类可以这样做:

WhateverLoop whateverLoop = new WhateverLoop();
Thread WhateverLoopThread = new Thread(whateverLoop);
whateverLoopThread.start();
// Do stuff which consumes time.
...
// Stop the loop
whateverLoop.setRun(false);

在这个例子中,我使用了一个布尔值,但显然你可以根据需要(或不是)使它变得复杂。

答案 2 :(得分:0)

执行此操作的一种方法是以这样一种方式表示执行状态,即恢复所需的子集可以存储在可从“上下文”对象访问的堆对象中。

要暂停执行,您可以让解释器在上下文对象中记录所有相关状态,然后将其返回。要恢复,请调用解释器传递先前使用的上下文。

如果你的解释器执行程序树的递归遍历来执行它,这将不起作用......


另一种方法是通过让解释器执行对CLI的回调(或者在程序暂停时处理内容的任何东西)来实现“暂停”。 CLI通过从回调方法返回来“恢复”执行。

答案 3 :(得分:0)

您是否考虑过从BlockingQueue控制它?

使用N个指令的队列启动它以执行它。它将从队列中提取每条指令并对其进行处理。一旦到达第N条指令,它将停止/阻止。要从停止的位置再次启动它,请将更多指令推入队列。

相关问题