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

あなたはそれをから制御することを考えましたBlockingQueueか?

実行するためのN個の命令のキューで開始します。キューから各命令をプルして処理します。N番目の命令に達すると、停止/ブロックされます。中断したところから再開するには、さらに多くの命令をキューにプッシュします。

于 2012-05-14T09:32:40.240 に答える
0

これを行う1つの方法は、再開に必要なサブセットを「コンテキスト」オブジェクトから到達可能なヒープオブジェクトに格納できるように実行状態を表すことです。

実行を一時停止するには、インタープリターに関連するすべての状態をコンテキストオブジェクトに記録させ、それを返します。再開するには、以前に使用したコンテキストを渡すインタープリターを呼び出します。

インタプリタがプログラムツリーを再帰的にウォークして実行する場合、これは機能しません...


これを行う別の方法は、インタープリターにCLI(またはプログラムが一時停止している間に処理するもの)へのコールバックを実行させることによって「一時停止」を実装することです。CLIは、コールバックメソッドから戻ることによって実行を「再開」します。

于 2012-05-13T12:49:59.853 に答える
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

これを行う簡単な方法は、wait() および notify() メソッドを使用することです。もちろん、notify() メソッドはどのスレッドが実際に起動されるかを保証できないため、実行する並列スレッドの数によって異なります。

于 2012-05-13T12:23:59.270 に答える