2

私はAndroidプログラミングが初めてです.この種の質問が以前に尋ねられた場合は申し訳ありません. スレッドの作成中に問題が発生しました。コードで初期化int i=500;を行い、最初のスレッド t1 で t1 の値をインクリメントしたいのですがif(i<5000)、スレッド t2 で t2 の値がデクリメントされる条件を確認したいのですが、if(i>0) 助けてください...前もって感謝します

4

2 に答える 2

2

AsyncTask を使用してこれを行うことができます: http://developer.android.com/reference/android/os/AsyncTask.html

Android の一部のバージョンでは、AsyncTask が単一のスレッドで実行されることに注意してください。並列で実行する必要がある場合は、ドキュメントからタスクに設定する必要があります。

最初に導入されたとき、AsyncTasks は単一のバックグラウンド スレッドでシリアルに実行されました。DONUT 以降、これはスレッドのプールに変更され、複数のタスクが並行して動作できるようになりました。HONEYCOMB 以降、並列実行によって発生する一般的なアプリケーション エラーを回避するために、タスクは単一のスレッドで実行されます。本当に並列実行が必要な場合は、THREAD_POOL_EXECUTOR を使用して executeOnExecutor(java.util.concurrent.Executor, Object[]) を呼び出すことができます。

さらに、同時実行の問題が発生するため、それらを処理するための手順を実行する必要があります。

次のようになります。

public class DoingTwoThings {

private AsyncTask<Void, Void, Void> taskA;
private AsyncTask<Void, Void, Void> taskB;
private volatile int i;

public DoingTwoThings() {
    createTaskA();
    createTaskB();
    startTasks();
}

private void createTaskA() {
    taskA = new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... voids) {
            doInBackgroundA();
            return null;
        }
    };
}

private void doInBackgroundA() {
    while (i < 5000) {
        i++;
    }
}

private void createTaskB() {
    taskB = new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... voids) {
            doInBackGroundB();
            return null;
        }
    };
}

private void doInBackGroundB() {
    while (i > 0) {
        i--;
    }
}

private void startTasks() {
    // AsyncTasks executed one one thread in Honeycomb+ unless executed in thread pool manually
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        taskA.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        taskB.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    } else {
        taskA.execute();
        taskB.execute();
    }
}}

オーバーライドされた「doInBackground()」メソッドのコードは、別のスレッドで実行されます。タスクが完了する前または後に UI を変更する必要がある場合は、onPreExecute と onPostExecute を簡単にオーバーライドできます。

于 2013-10-30T05:37:26.983 に答える