ThreadとRunnableの違い

9614 ワード

「回転」http://www.360doc.com/content/10/1219/22/573136_79607619.shtml
スレッドにRunnableインターフェースを実現させるのはいつですか?
JDKヘルプドキュメントの原語:Runnable インターフェースは、あるスレッドを通じてそのインスタンスを実行しようとするクラスによって実現されるべきである.孫鑫先生の原語は、スレッドの中にあるrun()方法以外の方法を変更する必要がない場合、スレッドにRunnableインターフェースを実現させる.(意味は分かりますが、何の役に立つか分かりません.      汗!!)
一つのスレッドにRunnableインターフェースを実現させると、このスレッドを呼び出すオブジェクトが複数のスレッドを開くと、これらのスレッドに同じ変数を呼び出すことができます.このスレッドがThreadクラスを継承するものであれば、内部クラスを通じて上記の機能を実現するために、内部クラスが外部変数に任意にアクセスできるという特性を利用する.例プログラム:
 1 public class ThreadTest  2 {  3 public static void main(String[] args)  4 {  5    MyThread mt=new MyThread();  6    new Thread(mt).start();     //    Runnable             

 7    new Thread(mt).start();     //    Runnable             

 8    new Thread(mt).start();     //    Runnable               9    //               mt   ,  run()          index

10 } 11 } 12 

13 class MyThread implements Runnable    //  Runnable  

14 { 15 int index=0; 16 public void run() 17 { 18    for(;index<=200;) 19     System.out.println(Thread.currentThread().getName()+":"+index++); 20 } 21 }
 1 public class ThreadTest  2 {  3 public static void main(String[] args)  4 {  5    MyThread mt=new MyThread();  6    mt.getThread().start();       //                  

 7    mt.getThread().start();      //                  

 8    mt.getThread().start();      //                    9    //                     ,  run()          index

10 } 11 } 12 

13 class MyThread 14 { 15 int index=0; 16 private class InnerClass extends Thread    //       ,  Thread

17 { 18    public void run() 19  { 20     for(;index<=200;) 21      System.out.println(getName()+":"+index++); 22  } 23 } 24 Thread getThread()     //          InnerClass       

25 { 26    return new InnerClass(); 27 } 28 } 29 //       :                 ,              final,         index     final         ?
 
ThreadとRunnable
1、ThreadとRunnableを認識する
Javaでマルチスレッドを実現するには、Threadクラスを継承するか、Runnableインターフェースを実現する二つの方法があります.Runnableはインターフェースであり、インターフェースでスレッドを生成することを提案しています.インターフェースはマルチ継承が可能で、Runnableは一つのrun方法しかなく、継承に適しています.Threadを使用する場合はThreadを継承し、newの一例が出てきます.startを呼び出す方法はスレッドを起動することができます.
Thread Test=new Thread()
Test.start();
Runnableを使用する場合は、まずnewでRunnableの一例を実現してから、Threadを起動してください.
Test impelements Runnable;
Test t=new Test()
Thread test=new Thread(t)
test.start();
まとめ:ThreadとRunnableはjavaマルチスレッドを実現する2つの方式であり、runableはインターフェースであり、threadはクラスであり、ルナブルを使ってjavaマルチスレッドを実現することを提案しています.いずれにしても、最終的にはthread.startを通じてスレッドを実行可能な状態にする必要があります.
2、Threadのstartとrunを知っています.
1)start:
start方式でスレッドを起動し、マルチスレッドの実行を実現した場合、runメソッドの本体コードの実行が完了するまで待つ必要はなく、直接に次のコードを実行します.Thread種類のstart()メソッドを呼び出してスレッドを起動します.このスレッドは準備完了(実行可能)の状態で、実行されていません.cpuタイムプレートを取得すると、run()メソッドが実行されます.ここでは、スレッド体といいます.これは実行するスレッドの内容を含んでいます.Runメソッドの実行が終了します.
2)run:
run()方法はただの一般的な方法です.Runメソッドを直接呼び出しても、プログラムにはまだメインスレッドというスレッドしかありません.プログラムの実行経路は一つしかないですか?それとも順番に実行しますか?
まとめ:startメソッドを呼び出すとスレッドが起動しますが、runメソッドはthreadの一般的な方法で呼び出されますか?それともメインスレッドで実行されますか?
3、スレッド状態説明
スレッド状態は、大きな観点から、初期状態、実行可能状態、実行不可能状態、消滅状態に帰結することができ、具体的には上の図に示す7つの状態に細分化することができ、以下のように説明する.
1)スレッドの実装には、Threadクラスを継承し、もう一つはRunnableインターフェースを実現する方法がありますが、いずれにせよ、newがthreadインスタンスを作った後、スレッドは初期状態に入りました.
2)対象がstart()メソッドを呼び出した場合、運転可能状態に入ります.
3)運転可能状態に入ると、そのオブジェクトがオペレーティングシステムによって選択され、CPUタイムプレートを取得すると運転状態になります.
4)運転状態になると、caseが多くなります.大体次のような状況があります.
・run()メソッドまたはmain()メソッドが終了すると、スレッドは終了状態になります.
・スレッドが自身のsleep()メソッドまたは他のスレッドのjoin()メソッドを呼び出した場合、現在のスレッドを停止しながら占有されているリソースを解放しない状態になります.sleep()が終了するか、join()が終了すると、このスレッドは実行可能状態に入り、OS割り当てのタイムプレートを待ち続ける.
・スレッドが運転可能状態に入った直後(まだ動作していません)には、呼び出されるリソースがロックされていることが分かりました.スレッドがロックされた後、ロックマークが取得されるのを待っています.運転可能状態に移行し、OSがCPUタイムプレートを割り当てるのを待つ.
・スレッドがwait()メソッドを呼び出すと待ち行列に入ります(この状態になると占有しているすべてのリソースが解放されます.ブロック状態とは異なり)、この状態になると自動的に起動できなくなり、他のスレッドでnotify()やnotifyAll()メソッドを呼び出してから呼び覚まされます(notify()スレッドを起動するだけですが、どのスレッドが起動しているかは特定できません.起動するスレッドが呼び覚まされないかもしれません.したがって、実際に使う時は、一般的にはnotifyAll()の方法でスレッドが呼び覚まされます.スレッドが起動されるとロックプールに入り、ロックマークが取得されるのを待ちます.
・スレッドがstopメソッドを呼び出すと、スレッドは消滅状態になりますが、stop方法は安全ではないので、使用を奨励しません.みんなはrunメソッドの条件を通じてスレッドのstopを実現できます.