我遇到了一些暂停和恢复方法的麻烦。 (在Eclipse中使用Java)。
基本上我正在编写一个有点像编译器的程序。我给它一个字符串,它解释这个字符串,在一个n个命令,条件和循环(取决于强)之类的东西中转换它并执行这些命令。像这样:
(while
(energy-at-least 1000)
(seq
(move)
(turn clockwise)
)
)
目前我有一个在第N个命令停止的方法,但我不确定如何在此之后继续,因为重复使用此方法并告诉它从第N + 1个命令启动它会忘记程序在环(一个或多个)。
对于糟糕的解释感到抱歉,但基本上我需要能够在第N个命令停止此方法并让它从它所遵循的课程中恢复。 Java有这些方法(resume()和stop())但是我已经看过它们已被弃用了。有人有个好主意吗?
答案 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条指令,它将停止/阻止。要从停止的位置再次启动它,请将更多指令推入队列。