3

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

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

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

目前我有一个在第 N 个命令处停止的方法,但我不确定在此之后如何继续,因为重用此方法并告诉它在第 N+1 个命令处开始它会忘记程序处于循环中(s )。

抱歉解释不佳,但基本上我需要能够在第 N 个命令处停止此方法并让它从它所遵循的过程中恢复。Java 有这些方法(resume() 和 stop() ),但我见过它们已被弃用。有人有好主意吗?

4

4 回答 4

0

一个简单的方法是使用 wait() 和 notify() 方法。当然,这将取决于您将运行多少并行线程,因为 notify() 方法无法保证您实际上将唤醒哪个线程。

于 2012-05-13T12:23:59.270 回答
0

据我了解,您的说法是,您需要对线程中的循环进行更细粒度的控制,然后提供“通知”、“恢复”等方法。你可以这样做:

线程的类可能如下所示:

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

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

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

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

控制类可以这样做:

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

在这个例子中,我使用了一个布尔值,但显然你可以让它变得像你想要的那样复杂(或不复杂)。

于 2012-05-13T12:33:54.477 回答
0

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

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

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


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

于 2012-05-13T12:49:59.853 回答
0

你有没有考虑过控制它BlockingQueue

以 N 条指令队列启动它以执行它。它将从队列中拉出每条指令并进行处理。一旦到达第 N 条指令,它将停止/阻塞。要从停止的地方重新开始,将更多指令推入队列。

于 2012-05-14T09:32:40.240 回答