Thread

thread.png

java.lang.Thread….Runnableをimplementしたクラス

スレッドの優先度

thread.setPriority(Thread.MAX_PRIORITY);

というようにスレッドには優先度をつけることができる
定数 意味
MIN_PRIOTIRY 1 最も低い優先度
NORM_PRIOTIRY 5 デフォルトの優先度
MAX_PRIOTIRY 10 最も高い優先度

スレッドをスタートさせる方法

Java start()
Objective-C dispatch_get_global_queue()
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            @autoreleasepool {
                //何かの処理をする
            }
        });

自分が今どのスレッドにいるのか?確認する方法

javaの場合

Thread.currentThread();

スレッドを呼び起こす方法

Object mThread=new Object();
mThread.notify();//notifyは複数あるwait状態にあるスレッドのうち一つを実行可能状態にします。

スレッドを終了する方法

Threadにstop()という直感的な名前のメソッドがありますが、この関数は安全ではありません。
データを破損する恐れがあるそうです。
じゃあ、どうやって終了させるのが安全なんだ?
run()の中の関数が終わればスレッドはTEMINATED状態になり、自然と終わります。
しかし、run()の中でwhile(true){}にして常駐スレッドにしてた場合は
、次のようにして終了させるのがおすすめです[1]

   public class StopThread {
       private static volatile boolean mStopRequested;//スレッド終了リクエストのフラグ変数を作る
      //stopRequestedフラグをいじるときは必ずsynchronizedすることが大事!! 
      private static synchronized void requestStop() {
           mStopRequested = true;
       }
       private static synchronized boolean stopRequested() {
           return mStopRequested;
       }
 
       public static void main(String[] args)
               throws InterruptedException {
           Thread backgroundThread = new Thread(new Runnable() {
               public void run() {
                   int i = 0;
                   while (!stopRequested())
                       i++; 
                }
           });
           backgroundThread.start();
           TimeUnit.SECONDS.sleep(1);
           requestStop();
       }
}

なぜスレッドを終了させないといけないの?

Androidの場合、Threadを終了させないままでいると、「戻る」ボタンを押してアプリを終了さsたときに、そのスレッドが生きたままになります。
そして再度アプリを開くと、同じ名前のスレッドが2個増える、という気持ちのわるい現象が起きてしまいます。DDMSで見てみましょう〜
つまり、アプリを終了させてもスレッドは働いてるまま=無駄に電池消費してる。
アプリを閉じたり開いたりするたびに、スレッドは増える。仕事が2倍、3倍になる、ということですね

Bibliography

effective-java

サポートサイト Wikidot.com effective-java