Android実戦テクニックの四十三:スレッドの終了による


これは古い面接問題です.通常、面接官はJavaスレッドの理解を聞いてから質問します.理論から実践に至るまで,これはよい道である.スレッドはオペレーティングシステムがマルチタスクを実現する方法であり、スレッドはタスクの実行ユニットであると理解できる.たとえばAndroidシステムでは、各Appに独自のプライマリ・スレッドがあり、worker threadの「パラレル」を作成して作業することもできます.
Javaで新しいスレッドを作成する方法
Javaはスレッド(Thread)に言語レベルのサポートを提供しています(仮想マシンを頼りにしましょう).java.langパッケージにはThreadクラスとRunnableインタフェースがあり、新しいスレッドの作成を完了することができます.1、extends Threadクラス
private class NumberCountThread extends Thread {
        public void run () {
            for (int i = 0;i<1000*1000;++i) {
                Log.d(TAG,"count: "+i);
                if(mThread.isInterrupted()) {
                    Log.d(TAG,"interrupted, return!");
                    return;
                }
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

2、implements Runnableインタフェース
private class NumberCountRunnable implements Runnable {
        public void run() {
            int i = 0;
            while (true) {
                Log.d(TAG, "count: " + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                i++;
            }
        }
    }

3、起動
Thread mThread;
//Thread
        mThread = new NumberCountThread();
        mThread.start();
//Runnable

        mThread = new Thread(new NumberCountRunnable());
        mThread.start();

Javaスレッドの実行状態
1、New、新しいスレッド2、Runnableを作成し、startメソッドを呼び出すとスレッドの準備が整い、CPUの使用権の取得を待つ.3、Running、スレッドは正式に運行して、runの中のコードを実行します.4、Blocked、ブロック状態はいくつかの状況に分けられる:wait方法を呼び出す;スレッドはオブジェクトの同期ロックを取得します.sleepメソッドまたはjoinメソッドを呼び出す.IOリクエストを発行します.5、Dead、スレッド実行完了、またはその他の理由でrunメソッドを終了すると、ライフサイクルが終了します.
スレッドを終了
スレッドDeadの状態を見ると、スレッドの実行が完了すると自動的に生命が終了することがわかります.これは、一般的な方法の1つ、スレッドタグを引き出します.上記の2つの例では、ループボディにbooleanタグを配置し、falseのときにループを停止すると、スレッドが実行されます.例:
private boolean mThreadFlag = true;
private class NumberCountThread implements Runnable {
        public void run() {
            int i = 0;
            while (mThreadFlag) {
                Log.d(TAG, "count: " + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                i++;
            }
        }
    }

もう1つの場合、スレッドは単一の時間のかかるタスクを実行するだけで、方法は失効します.スレッドのstopメソッドは推奨されていませんが、どのような方法で終了しますか?現在interruptメソッドを使用して「中断」し、runメソッドを直ちに終了させ、Dead状態にしています.
UIスレッドと同期
1、Handler+Message参考:「Android実戦テクニックの38:Handler使用中に発生するメモリ漏れ」
2、View.postメソッドはassertsの画像を読み取る際にスレッドを用いたので,そのままメインスレッドにpostしましょう.
try {
    //InputStream inputStream = getResources().openRawResource(R.id.xxx); 
    InputStream inputStream = assetManager.open("android/xxx.png");
    final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
    mMainLayout.post(new Runnable() {
        @Override
        public void run() {
            Log.d(TAG, "set image");
            mMainLayout.setBackground(new BitmapDrawable(bitmap));
        }
    });
    inputStream.close();
} catch (IOException e) {
    e.printStackTrace();
}

Activity Destroy後worker threadは終了しますか?
プライマリ・スレッドと他のスレッドは2つの独立した存在と考えられ、このthreadを起動したActivityの破棄は、タスクが完了するか、外部が中断するまで実行を継続することに影響しません.もちろん、App全体が終了すると、プロセス(Androidの1つのプロセスが独立した仮想マシンを占有している)が破棄され、スレッドも終了します.
isInterrupted()は機能しませんか?
sleep静的メソッドを使用してスレッドをスリープさせると、
    try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }

Interruptメソッドを呼び出すとInterrupted Exceptionを投げ出すのでThread.currentThread().isInterrupted()はthread終了表示として機能しません.
    while (!Thread.currentThread().isInterrupted()) {//do not work anymore
        Log.d(TAG, "count: " + i);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        i++;
    }

参照先:http://blog.csdn.net/huang_xw/article/details/7316354 http://www.cnblogs.com/riskyer/p/3263032.html