スレッド起動

6274 ワード

=-=-=-=-=-=-ここで分割線=-=-=-=-=-biubiubiu~いいと思います他のブログを引き続き読むことができますよこのアナウンサーは権利侵害があれば私に連絡して修正してください、日常のオンライン、もしオンラインでないならば直ちに返事して待つことを許してください=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
スレッドを実装して起動するには、2つの方法1があり、1つのクラスを書いてThreadクラスから継承し、runメソッドを書き換える.startメソッドでスレッド2を起動し、クラスを書いてRunnableインタフェースを実現し、runメソッドを実現する.new Thread(Runnable target).start()メソッドで起動
マルチスレッド原理:ゲーム機に相当し、1つのゲーム機(cpu)しかありませんが、多くの人が遊ぶので、startは並んでいます!CPUがあなたの番になるのを待って、あなたはrun()で、CPUの運行のタイムスライスが実行し終わると、このスレッドは引き続き並んで、次のrun()を待っています.
start()を呼び出すと、スレッドは待機キューに配置され、CPUスケジューリングを待つので、すぐに実行を開始する必要はありません.このスレッドを可動行状態にするだけです.その後、JVMを使用すると、スレッドThreadはrun()メソッドを呼び出し、このスレッドのスレッドボディを実行します.startを呼び出してrunを呼び出すのは面倒ですが、runを直接呼び出さないように?マルチスレッドの利点を実現するために、このstartがなければだめです.
1.start()メソッドはスレッドを起動し、本当にマルチスレッド実行を実現します.この場合runメソッドボリュームコードの実行が完了するのを待つ必要はなく、直接次のコードを実行することができます.Threadクラスのstart()メソッドを呼び出してスレッドを起動します.このスレッドは準備完了で実行されません.その後、このThreadクラスがメソッドrun()を呼び出して実行を完了し、ここでメソッドrun()はスレッドボディと呼ばれ、実行するこのスレッドの内容が含まれており、Runメソッドの実行が終了し、このスレッドが終了する.その後、CPUは他のスレッドをスケジューリングする.2.run()メソッドは、通常のメソッドとして呼び出されます.プログラムは順番に実行するか、runメソッド体の実行が完了してから、次のコードを実行し続けることができます.プログラムにはプライマリ・スレッドしかありません.このスレッドは、プログラム実行パスが1つしかありません.これにより、書き込みスレッドの目的が達成されません.
覚えておいてください:マルチスレッドはCPUを時間分割して利用して、マクロ的にすべてのスレッドを一緒に実行させて、同時と呼ばれます
 1 public class Test {  
 2     public static void main(String[] args) {  
 3         Runner1 runner1 = new Runner1();  
 4         Runner2 runner2 = new Runner2();  
 5 //      Thread(Runnable target)   Thread  。  
 6         Thread thread1 = new Thread(runner1);  
 7         Thread thread2 = new Thread(runner2);  
 8 //      thread1.start();  
 9 //      thread2.start();  
10         thread1.run();  
11         thread2.run();  
12     }  
13 }  
14   
15 class Runner1 implements Runnable { //  Runnable ,jdk   
16     public void run() {  
17         for (int i = 0; i < 100; i++) {  
18             System.out.println(" Runner1 ——————————" + i);  
19         }  
20     }  
21 }  
22   
23 class Runner2 implements Runnable { //  Runnable ,jdk   
24     public void run() {  
25         for (int i = 0; i < 100; i++) {  
26             System.out.println(" Runner2 ==========" + i);  
27         }  
28     }  
29 }  


【スレッドの作成と起動の手順(Runnableインタフェースの実装)】
1.Runnableインタフェースの実装クラスを定義し、runメソッドを書き換える.run()メソッドのメソッド体はスレッド実行体である.
   class SonThread  implement Runnable{

  public void run(){

  ......

  }

 }

2.Runnableインタフェース実装クラスのインスタンスを作成します.sonThread s1=new SonThread();
3.このインスタンスをThreadのtargetとして使用してThreadオブジェクトを作成します.Thread t1 =new Thread(s1);
4.オブジェクトのstart()メソッドを呼び出してスレッドを開始します.t1.start();
【注意一:命名について】
Threadオブジェクトを作成するときに、そのThreadオブジェクトの名前を指定できます.
【注意2:Threadの構造方法】
RunnableオブジェクトはThreadオブジェクトのtargetとして,Runnable実装クラスにはrunメソッドが実行体としてのみ含まれる.つまりThreadクラスの役割はrunメソッドをスレッドの実行体にパッケージすることである.
実際に実行されるスレッドオブジェクトは依然としてThreadインスタンスであり、このThreadスレッドがtargetのrunメソッドを実行する責任を負うだけである.
 1 //1.1 Runnable 
 2 class SecondThread implements Runnable{
 3 
 4     //1.2 run 
 5     @Override
 6     public void run() {
 7         for(int i=0;i<10;i++){
 8             System.out.println(Thread.currentThread().getName()+"===="+i);
 9         }
10     }
11     
12 }
13 public class Demo2 {
14     
15     public static void main(String[] args) {
16         //2. Runnable 
17         SecondThread s1=new SecondThread();
18         SecondThread s2=new SecondThread();
19         //2. Runnable Thread target, Thread 
20         Thread t1=new Thread(s1);
21         Thread t2=new Thread(s2,"Higgin");  // Thread 
22         
23         // 
24         t1.start();
25         t2.start();
26         
27         for(int i=0;i<10;i++){
28             System.out.println(Thread.currentThread().getName()+"===="+i);
29         }
30     }
31 }


JDKソースコードによるThread(Runable target…)呼び出しのrunメソッドの解析
コード1:

 1 new Thread(new Runnable() {  
 2     @Override  
 3     public void run() {  
 4         System.out.println("Run of Runnable");  
 5     }  
 6 }) {  
 7     public void run() {  
 8         System.out.println("Run of Thread");  
 9     }  
10 }.start();  


コード2:

 1 new Thread(new Runnable() {  
 2     @Override  
 3     public void run() {  
 4         System.out.println("Run of Runnable");  
 5     }  
 6 }) {  
 7     public void run() {  
 8         System.out.println("Run of Thread");  
 9         super.run();  
10     }  
11 }.start();  


まず、JDKのThreadソースコードを見てみましょう.セグメント3は以下の通りです.
1 private Runnable target;  
public void run() {  
    if (target != null) {  
        target.run();  
    }  
}  

run()メソッドでは、まずtargetが空であるかどうかをチェックし、そうでない場合は、targetのrun()メソッドを実行します.
では,上記の2つのコードの実行についても明らかである.
最初のコードセグメント1では、Threadのrun()メソッドが書き換えられ、同時にrun()メソッドも実装されたRunnableオブジェクトが渡される.このThreadオブジェクトがstart()メソッドを呼び出すと、そのオブジェクトが書き換えられたrun()メソッドが実行され、その出力結果がRun of Threadとなり、出力が完了するとrun()メソッドが戻り、そのスレッドオブジェクトのライフサイクルが終了する.
2番目のコードセグメント2においても同様にThreadのrun()メソッドが書き換えられ,同時にRunnableオブジェクトが渡され,run()メソッドが実現される.唯一の違いは、Thread書き換えrun方式では、印刷出力後にsuperが実行することである.run()、これでおもしろいです.
まず,このスレッドが実行を開始すると,その書き換えrun()メソッドを実行し,Run of Threadを出力する.
次にsuperを呼び出します.run()は、スーパークラスを呼び出すrun()メソッドであり、このスーパークラスのrun()メソッド、すなわちJDKで定義されたThreadクラスのrun()は、上述のコードセグメント3に示すように実行される.明らかにtargetは空ではありません.この場合、オブジェクトのrun()メソッドが呼び出され、Run of Runnableが出力されます.
上記のThreadがrun()メソッドを書き換えていない場合、実行結果は同じです.まず、このThreadのrun()メソッドが実行されるが、このときメソッドは書き換えられていないため、JDKが定めたrun()メソッド、すなわち上記のコードセグメント3が呼び出され、このコードセグメントではtargetが空であるか否かが判断され、明らかにそうではないので、Runnableオブジェクトが実装するrun()メソッドが呼び出される.
まとめ:Thread(Runnable target…)については,渡されたTargetが空であるかどうかにかかわらず,まずThread独自のrun()メソッドが実行される.この方法を書き換える、その方法にsuperがない場合.run()は,Runnable実装を決して呼び出さないrun()メソッドである.このメソッドが書き換えられていない場合、targetが空であるか否かを判断し、target実装を呼び出すrun()メソッドを決定する.この方法を書き換えると、その方法にsuperがある.run()は、文を実行する前のすべてのコードが完了すると、targetが空であるか否かを判断し、target実装のrun()メソッドを呼び出し、実行後、文の後のコードを実行することを決定する.
=-=-=-=-=-=-ここで分割線=-=-=-=-=-biubiubiu~いいと思います他のブログを引き続き読むことができますよこのアナウンサーは権利侵害があれば私に連絡して修正してください、日常のオンライン、もしオンラインでないならば直ちに返事して待つことを許してください=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-