1

さて、シミュレーションを実行しています。シミュレーションのGUIでactionListenersを実行する2つのJButtonを実装しました。一時停止ボタンを押すとシミュレーション全体が一時停止し、再開ボタンを押すと再開するようにしたいのです。

複数のスレッドが実行されており、一時停止ボタンがクリックされたときに各スレッドを取得してwait()メソッドを呼び出そうとしましたが、成功しませんでした。

したがって、これを行う方法についていくつかのアドバイスが必要です。GUIにSwingを使用していますが、リスナーは正常に動作します。何が起こったかを確認するために、(MVCパターンを使用して)Viewクラスの現在のスレッドでsleep()とwait()を呼び出そうとしましたが、アプリケーション全体がクラッシュしました。

何か案は?

4

4 に答える 4

3

制御(GUI)スレッドからの「シグナル」を受け入れ、次の制御シグナルが実行を再開するのを待つ追加のロジックをシミュレーションスレッドに提供する必要があります。

たとえばvolatile boolean isPaused、シミュレーションスレッドでインスタンスフィールドを使用できます。シミュレーションスレッドを一時停止/再開するには、true/falseに設定します。シミュレーションスレッドで、対応するロジックを実装します。

public void run() {
    while (true) {
        simulate();
        while (isPaused) {
            Thread.sleep(100);
        }
    }
}
于 2012-12-03T19:45:08.937 に答える
2

アニメーションがSwingを使用している場合、Timer簡単な答えはを呼び出すことstop()です。

TimerアクションがEDTで確実に実行されるため、forアニメーションを使用することを強くお勧めします。

于 2012-12-04T02:08:01.577 に答える
0

ThreadGroupすべてのスレッドを保存するためのを作成してから、を使用してみてください。

ThreadGroup threadGroup = Thread.currentThread( ).getThreadGroup( );

ちなみに、それExecutorServiceも良い選択です。

于 2012-12-03T19:40:06.400 に答える
0

共有オブジェクトを使用して、2つのクラス間で通信します。次に、ボタンがクリックされたときにGUIに状態オブジェクトの値を設定させ、もう一度クリックされたときに値を再度変更します。サンプルコードは次のとおりです。

public class Simulation implements Runnable {
  private State myState = null;

  public Simulation(State myState) {
    this.myState = myState;
  }

  public void run() {
    while(myState != null) {
      if (myState.isPaused()) myState.wait();
      // Do other stuff
    }
  }
}

public class MainClass implements ActionListener() {
  private State myState = new MyState();

  private void beginSimulation() {
    Simulation s = new Simulation(this.myState());
    new Thread(s).start();
  }  

  public void actionPerformed(ActionEvent e) {
    if(myState.isPaused()) {
      myState.setPaused(false);
      myState.notify();
    } else {
      myState.setPaused(true);
    }
  }
}

public class MyState() {
  private boolean paused = false;
  public MyState(boolean paused) { this.paused = paused; }
  public boolean getPaused() { return paused; }
  public void setPaused(boolean paused) { this.paused = paused; }
}
于 2012-12-03T19:46:31.213 に答える