Javaマルチスレッドの実現方式とライフサイクル


Javaのスレッドの実現方式
1.Runnableインターフェースを実現する
class MyThread implements Runnable{
      private String name ;       //         
      public MyThread(String name){ 
          this.name = name ;      //         name   
      } 
      public void run(){  //   run()  ,           
          for(int i=0;i<10;i++){ 
              System.out.println(name + "  ,i = " + i) ; 
         } 
     } 
};

public class RunnableDemo01{ 
     public static void main(String args[]){ 
         MyThread mt1 = new MyThread("  A ") ;    //       
         MyThread mt2 = new MyThread("  B ") ;    //       
         Thread t1 = new Thread(mt1) ;       //    Thread    
         Thread t2 = new Thread(mt2) ;       //    Thread    
         t1.start() ;    //       
         t2.start() ;    //       
     } 
};
2.Thread類の継承
​
class MyThread extends Thread{
      private String name ;       //         
      public MyThread(String name){ 
          this.name = name ;      //         name   
      } 
      public void run(){  //   run()  ,           
          for(int i=0;i<10;i++){ 
              System.out.println(name + "  ,i = " + i) ; 
         } 
     } 
};

public class ThreadDemo01{ 
     public static void main(String args[]){ 
         MyThread mt1 = new MyThread("  A ") ;    //       
         MyThread mt2 = new MyThread("  B ") ;    //        
         mt1.start() ;    //       
         mt2.start() ;    //       
     } 
};

​
スレッドの5状態
スレッドは通常5つの状態を持ち、それぞれ作成、準備、運転、ブロック、終了です。各状態は以下のように説明します。
  • 作成状態 
  • プログラムでは、スレッドオブジェクトを構造的に作成した後、新しいスレッドオブジェクトが新規に作成されています。このとき、メモリ空間と他のリソースが既にありますが、まだ実行できない状態です。新しいスレッドオブジェクトは、例えば「Thread thread=new Thread()」のようなThread類の構造方法で実現することができます。
  • レディ状態 
  • スレッドオブジェクトを新規作成したら、スレッドのstart()を呼び出すとスレッドが起動します。スレッドが起動すると、スレッドは準備完了状態になります。この時、スレッドはスレッド列に入り、CPUサービスを待っています。これは、実行条件がすでに備わっていることを示しています。
  • 運転状態 
  • 準備完了状態が呼び出されてプロセッサリソースが得られると、スレッドは実行状態に入ります。この時、スレッドオブジェクトのrun()を自動的に呼び出します。run()方法は、このスレッドの動作と機能を定義する。
  • 遮断状態 
  • 実行中のスレッドは、特定の場合には、人が保留されたり、時間がかかる入出力操作を行うと、CPUに自分の実行を一時停止させて、ブロック状態になります。実行可能な状態で、sleep()、suspend()、wait()を呼び出すと、スレッドがブロック状態になり、ブロックが発生した時にスレッドが列に入ることができなくなり、渋滞の原因が解消された時にのみ、スレッドが準備状態に移行することができます。
  • 死亡状態 
  • スレッドがstop()を呼び出した場合、またはrun()メソッドの実行が終了した後、すなわち死亡状態となります。死亡した状態のスレッドは動作を継続する能力がない。
    スレッド同期
    一つのマルチスレッドプログラムがRunnableによって実現されると、クラス内の属性は複数のスレッドで共有され、複数スレッドが同じリソースを操作すると、リソース同期問題が発生する可能性がある。
    解決方法:
    1.同期コードブロック
    synchronized(    ){
              
    }
    2.同期方法
    synchronized           (    ){ 
     
    }