1

停止したい実行中のスレッドがあり、後で再開します。これらは非推奨であり、スレッドを正常に停止しているように見える以下のコードにたどり着いたため、stop() などを使用しないことを学びました。run メソッドを終了するだけです。さて、どうすれば再開できるでしょうか?start() メソッドを呼び出すと、スレッドがまだ実行されていると表示されるので、この状況で run() を直接呼び出すとどうなりますか? それは何か問題を引き起こしますか?ところで、違いがある場合、これは Android アプリ用です。

private volatile stopThread;

public void stopButton() {
    // this is called when button is clicked
    // and thread is already started and running
    stopThread= true;
}

public void run() {

    while (!stopThread) {
        // do something here
    }

    stopThread=false;
}

編集:スレッドが開始されたときに開始するタイマーであり、一時停止して再度開始できます。したがって、timer は Thread オブジェクトを含むクラスです (既に SurfaceView でクラスを拡張しています)。

4

3 に答える 3

6

スレッドを安全に停止および再開する唯一の安全な方法は、スレッド本体の関連するポイントにコードを追加して、スレッドを処理することです。(非推奨のスレッド停止/一時停止/再開は基本的に安全ではないため、使用しないでください。)

アプリケーション固有のフラグまたはThread.interrupt()メカニズムのいずれかを使用すると、再開せずに停止するのは比較的簡単です。Javaの同期およびIOAPIの一部は割り込みを認識しているため、後者の方がおそらく優れています。ただし、既存のライブラリの多くが割り込みを認識していない、またはInterruptedException 適切に処理されていないという問題に直面します。

再開して停止するのはもっと難しいです。次のような独自のクラスを作成する必要があります。

public class PauseControl {
    private boolean needToPause;

    public synchronized void pausePoint() {
        while (needToPause) {
            wait();
        }
    }

    public synchronized void pause() {
        needToPause = true;
    }

    public synchronized void unpause() {
        needToPause = false;
        this.notifyAll();
    }
}

myPauseControl.pausePoint()スレッドのコード全体の関連するポイントに呼び出しを追加します。これでは、IOまたは「子」スレッドでのアクティビティを一時停止することはできず、pausePointメソッドを呼び出すコード内のポイントでのみ一時停止することに注意してください。また、スレッドが他の何かをロックしている間、または他の何かが応答を待っている間、スレッドを一時停止して問題が発生することに注意する必要があります。

于 2012-08-08T01:22:54.023 に答える
2

Java 1.4 のドキュメントでは、その理由が説明されており、代わりにsuspend()andresume()を使用することで、廃止されたさまざまな Thread メソッドの代替手段が提供されています。wait()notify()

Thread.suspend と Thread.resume の代わりに何を使用すればよいですか? という見出しを探します。ページの半分くらい。 

于 2012-08-08T01:11:21.577 に答える