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