Java-スレッドのstartメソッドとrunメソッドの違い

1.スレッドのstart()とrun()を知る

1。start():

APIでのこのメソッドの導入を見てみましょう
。実行するスレッドを開始します。Java仮想マシンはスレッドのrunメソッドを呼び出します。
その結果、2つのスレッドが同時に実行されます。現在のスレッド(startメソッドの呼び出しから戻る)ともう1つのスレッド(runメソッドを実行する)です。
スレッドを複数回開始することは違法です。特にスレッドの実行が終了した場合、再起動することはできません。startメソッドを使用してスレッドを開始します。これにより、マルチスレッド操作が真に実現されます。この時点では、runメソッドの本体コードの実行が完了するのを待って、次のコードを直接実行し続ける必要はありません。Threadクラスのstart()メソッドを呼び出してスレッドを開始します。この時点で、スレッドは準備完了(実行可能)状態で実行されていません。cpuタイムスライスが取得されると、run()メソッドが実行されます。ここで、run()メソッドが呼び出されます。これは、実行されるスレッドのコンテンツを含むスレッド本体です。Runメソッドが終了すると、スレッドは終了します。

2。run():

最初にAPIでのこのメソッドの導入を見てみましょう。
スレッドが独立したRunnableオブジェクトを使用して構築されている場合は、Runnableオブジェクトのrunメソッドを呼び出します。それ以外の場合、メソッドは何もせずに戻ります。
Threadのサブクラスは、このメソッドをオーバーライドする必要があります。run()メソッドはクラスの通常のメソッドです。Runメソッドを直接呼び出すと、プログラムにはメインスレッドのみが残り、プログラム実行パスは1つだけになります。順次実行する必要があります。 runメソッド本体が実行された後、待機する必要があります。スレッドを書き込む目的が達成されないように、次のコードを実行し続けることができます。

3.3。総括する:

スレッドはstartメソッドを呼び出すことによってのみ開始でき、runメソッドはスレッドの通常のメソッド呼び出しであり、メインスレッドで実行されます。

2つのコード例:

public static void main(String args[]) {
    
            
   	Thread t = new Thread() {
    
               
		 public void run() {
    
                   
  				pong();            
  		 }       
  	 };      
   	 t.start();       
     System.out.print("ping");   
}     
static void pong() {
    
           
      System.out.print("pong");   
}
 输出结果: pingpong  
public static void main(String args[]) {
    
    
        Thread t = new Thread() {
    
    
             public void run() {
    
    
                  pong();
             }
        };
       t.run();       
       System.out.print("ping");  
}     
static void pong() {
    
       
      System.out.print("pong");  
}
输出结果:pongping 

上記の2つのプログラム例を通じて、start()メソッドとrun()メソッドの違いを簡単に区別できます
。t.start();このコード行は、スレッドの開始t.run();と同等です。コード行は、tクラスでrunメソッドを使用するのと同じです。

3、スレッドステータスの説明:

スレッドの状態は、初期状態、実行可能状態、実行不可能状態、およびデッド状態として要約できます。これらは、次のように説明される上記の図に示す7つの状態に細分できます
。1)次の2つの実装があります。スレッド。1つはThreadクラスを継承する方法、もう1つはRunnableインターフェイスを実装する方法ですが、とにかく、スレッドインスタンスを新しくすると、スレッドは初期状態になります
。2)オブジェクトがstart()を呼び出すとメソッド、実行可能状態状態になります
。3)実行可能状態に入った後、オペレーティングシステムによってオブジェクトが選択されると、CPUタイムスライスが取得されたときに実行状態になります
。4)実行状態に入った後、大まかに次のように、より多くのケースがあります。

  • run()メソッドまたはmain()メソッドが終了すると、スレッドは終了状態になります。
  • スレッドが独自のsleep()メソッドまたは他のスレッドのjoin()メソッドを呼び出すと、ブロッキング状態になります(この状態は現在のスレッドを停止しますが、所有しているリソースを解放しません)。
  • sleep()が終了するかjoin()が終了すると、スレッドは実行可能な状態になり、OSがタイムスライスを割り当てるのを待ち続けます。
  • スレッドが実行可能状態になり(実行されていないことに注意)、呼び出されるリソースがロックされている(synchroniza、lock)ことを検出すると、スレッドはすぐにロックプール状態になり、ロックマークの取得を待機します(これで時が経つと、ロックプールは他のスレッドがロックマークの取得を待機しているため、この時点でキュー状態になります。これは先着順です)。スレッドがロックマークを取得すると、実行可能な状態になります。 OSがCPUタイムスライスを割り当てるのを待ちます。
  • スレッドがwait()メソッドを呼び出すと、待機キューに入ります(この状態に入ると、占有されているすべてのリソースが解放されます。これは、ブロッキング状態とは異なります)。この状態に入った後は、自動的に起動できません。依存する必要があります。 notify()またはnotifyAll()メソッドを呼び出す他のスレッドでは、ウェイクアップのみが可能です(notify()はスレッドのみをウェイクアップするためですが、どのスレッドが具体的にウェイクアップされているかはわかりません。おそらく、ウェイクアップする必要のあるスレッドはウェイクアップできません。ウェイクアップされるため、実際の使用では、通常、notifyAll()メソッドを使用して一部のスレッドをウェイクアップします。スレッドがウェイクアップされると、ロックプールに入り、ロックマークが取得されるのを待ちます。スレッドがstopメソッドを呼び出すと、スレッドはデッド状態になる可能性がありますが、stopメソッドは安全ではないため、使用しないことをお勧めします。runメソッドの条件を変更することで、スレッドの停止を実装できます。

おすすめ

転載: blog.csdn.net/qq_47768542/article/details/109702664