1

この質問を見ました: how to run one thread after complete another thread 、しかしそれに対する答えは私には適切ではありません。

私はAndroid用のそのような種類のJavaコードを持っています:

public void startTask(Runnable r)
    {
        running = true;
        Log.i(tag, "-----------start.Runnable-----------");

        Thread first = new Thread(r);
        first.start();

        Thread second = new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                running = false;
            }
        });
}

最初に、バックグラウンド サービスで処理しているいくつかのハード操作でThreadparam オブジェクトとして取得します。Runnableしたがって、メソッドを呼び出すとき: startTask()私はrunning = true;を設定します。タスクの二重実行を防ぎます。しかし、また、最初のスレッドが完了した直後に、2 番目のスレッドを開始して running = false;を設定する必要があります。他の操作を実行できるようにします。

メインスレッドをフリーズしないように、最初のスレッドの完了を秒単位で待つにはどうすればよいですか?? ありがとう!

4

3 に答える 3

7

を使用できますSingleThreadExecutor

Executor executor = Executors.newSingleThreadExecutor();
executor.execute(runnable1);
executor.execute(runnable2);
于 2012-12-04T02:56:15.533 に答える
6

これを試して:

final Thread first = new Thread(r);
first.start();

Thread second = new Thread(new Runnable() {

    @Override
    public void run() {
        first.join();
        // TODO Auto-generated method stub
        running = false;
    }
});
second.start();

私が変更され:

  • 「最初」の最後のキーワードを追加
  • 2 番目のスレッドの開始時に #join によって最初のスレッドの終了を待ちます。
  • すぐに 2 番目のスレッドを開始します。
于 2012-12-04T02:29:43.520 に答える
2

私は Android プログラマーではありませんが、次のようなものが機能する可能性があります。

private volatile boolean running = false;

public void startTask(final Runnable r)
{
    running = true;
    Log.i(tag, "-----------start.Runnable-----------");

    Runnable runme = new Runnable() {
        @Override
        public void run() {
            try {
                r.run();
            } finally {
                running = false;
            }
        }
    };

    new Thread(runme).start();
}

runningタスクを実行してからフラグをクリアするために必要なスレッドは 1 つだけです。この変数は複数のスレッドから読み書きされるためvolatile、 の宣言でのの使用に注意してください。running

于 2012-12-04T02:32:07.067 に答える