2012-05-13 16 views
3

メソッドを一時停止してから再開するときに問題が発生します。 (EclipseでのJavaの使用)メソッドの一時停止と再開

基本的に私はコンパイラのように少し動作するプログラムを書いています。私はそれに文字列を与え、それはこの文字列を解釈し、n個のコマンド、条件、ループのようなもの(強いものに依存する)のブロックで変換し、それらのコマンドを実行します。そのような:

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

私はN番目のコマンドで停止する方法がありますが、私は、このメソッドを再利用し、それを伝えるため、N番目の+ 1コマンドmmakesで開始するには、この後も継続する方法がわかりませんよプログラムがループしていることを忘れてしまいます。

申し訳ありませんが、説明が間違っていますが、基本的にはN番目のコマンドでこのメソッドを停止し、その後の処理から再開できるようにする必要があります。 Javaにはこれらのメソッド(resume()とstop())がありましたが、私はこれまで見たことがないです。誰もが良いアイデアを持っていますか?

+0

別のスレッドで再開するか、あなたのアイデアは何ですか? –

+0

OPをして、**方法を再開すると想像してみてください**。条件は何ですか?どのようなコードがその条件を引き起こすでしょうか? 99%の確率で別のスレッドから再開する必要があります。その場合、 'Object.wait'や' Object.notify'のような低レベルのものを混乱させたくない場合は、 'java.util.concurrent'のものが必要です。 –

+0

説明するのは少し難しいです。特に、これらの方法は全く新しいものです。基本的に、私はメソッドを呼びたいと思っています(これは私ができることです)、あるポイントで停止してから、再度呼び出すときに、メソッドはそのポイントの後に再開しなければなりません。それは停止することができなければならず、停止してから再開するまで何も起こっていないように、私が行動を再開するとき。申し訳ありませんまだ不明な場合は – Sven

答えて

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); 

制御クラスは、これを行うことができます。

+0

'whateverLoop.setRun(true);'実行を再開しますか? – Stallman

+0

@Stallmanいいえ、ループが再開しないのは、条件がfalseになったときにwhileループから抜け出すためです。再起動できるようにしたい場合は、決してループを壊してスレッドを一時停止するためにThread.sleepのようなものを使用してはいけません。 –

+0

はい、 'whateverLoop.setRun(false)'はスレッドを 'stop'にします。 – Stallman

0

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

0

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

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

あなたinterpretterがそれを実行するためのプログラムツリーの再帰的な散歩をする場合、これは動作しません...これを行うには


もう一つの方法は、interpretterを実行することにより、「一時停止」を実装することですCLI(またはプログラムが一時停止中に何かを処理するもの)にコールバックします。 CLIは、コールバックメソッドから戻って実行を「再開」します。

0

あなたはBlockingQueueから制御することを検討しましたか?

実行するためにN個の命令のキューで起動します。キューから各命令を引き出し、処理します。 N番目の命令に達すると、その命令は停止/ブロックされます。中断した場所からもう一度開始するには、さらに多くの命令をキューに押し込みます。

関連する問題