学習ノート2:javaでのThreadクラスとスレッドの作成

3449 ワード

スレッドはプログラム内の実行スレッドです.Java仮想マシンでは、アプリケーションが複数の実行スレッドを同時に実行できます.
各スレッドには優先度があり、高優先度スレッドの実行は低優先度スレッドより優先されます.各スレッドは、デーモンとしてマークできますか、マークできません.あるスレッドで実行されたコードが新しいThreadオブジェクトを作成すると、新しいスレッドの初期優先度はスレッドの作成の優先度として設定され、作成スレッドがデーモンスレッドである場合にのみ、新しいスレッドがデーモンとなる.
Java仮想マシンが起動すると、通常は単一の非デーモンスレッドがあります(指定したクラスのmainメソッドが呼び出されます).Java仮想機会は、次のいずれかが発生するまでスレッドを実行し続けます.
  • は、Runtimeクラスのexitメソッドを呼び出し、セキュリティマネージャは、終了操作の発生を許可する.
  • 非デーモンスレッドのすべてのスレッドは、runメソッドの呼び出しから戻るか、runメソッド以外に伝播する異常を投げ出すかにかかわらず、実行を停止した.

  • 新しい実行スレッドを作成するには、次の2つの方法があります.
    1):    1つの方法は、クラスをThreadのサブクラスとして宣言することである.このサブクラスは、Threadクラスのrunメソッドを書き換えるべきである.次に、サブクラスのインスタンスを割り当てて起動できます.
    public class DemoThread1 {
    	/**
    	 * @author        
    	 * @param args
    	 * date:2015-10-15
    	 */
    	public static void main(String[] args) {  //       main  
    		SpeakDog dog = new SpeakDog();  //     
    		SpeakPig pig = new SpeakPig();  //    
    		dog.start();  //     
    		pig.start();  //      
    		for( int i=1;i<=10;i++){
    			System.out.print("  "+i+" ");
    		}
    	}
    }
    
    
    public class SpeakDog extends Thread { // Thread    
    	@Override
    	public void run() {
    		for( int i=1; i<=5; i++){
    			System.out.print("  "+i+" ");
    		}
    	}
    }
    
    
    public class SpeakPig extends Thread {
    	@Override
    	public void run() {
    		for( int i=1;i<=7;i++){
    			System.out.print("  " + i +" ");
    		}
    	}
    	
    }
    
    //   JVM  dog , pig , main       cpu  。
    //              ,JVM   java     。
    //  :                                  ,           CPU       。

    2) スレッドを作成する別の方法は、Runnableインタフェースを実装するクラスを宣言することである.次いで、クラスはrun方法を実装する.次に、クラスのインスタンスを割り当て、Threadの作成時にパラメータとして渡して起動することができる.
    Thread(Runnable target)
    新しいThreadオブジェクトの割り当て
    public class DemoThread2 {
    	public static void main(String[] args) {
    		Thread speakdog;   // Thread    
    		Thread speakpig;   // Thread    
    		SpeakDog dog;   // dog      
    		SpeakPig pig;   // pig     
    		dog = new SpeakDog();  //      
    		pig = new SpeakPig();  //       
    		speakdog = new Thread(dog);  //            dog
    		speakpig = new Thread(pig);   //           pig
    		speakdog.start();  //    
    		speakpig.start();  //    
    		
    		for( int i=1; i<=10;i++){
    			System.out.print("  " + i +" ");
    		}
    	}
    }
    
    public class SpeakDog implements Runnable {
    	@Override
    	public void run() {
    		for( int i=1; i<=5; i++ ){
    			System.out.print("  "+ i + " ");
    		}
    	}
    
    }
    
    
    public class SpeakPig implements Runnable {
    
    	@Override
    	public void run() {
    		for( int i=1; i<=7; i++ ){
    			System.out.print("  "+ i + " ");
    		}
    	}
    
    }

    スレッド間で同じメモリユニット(コードとデータを含む)を共有し、これらの共有ユニットを利用してデータ交換、リアルタイム通信、必要な同期動作を実現することができる.
    Thread(Runnable target)コンストラクションメソッドでスレッドを作成すると、CPUリソースを使用したいときにターゲットオブジェクトの順番が来ると、インタフェースのrun()メソッドが自動的に呼び出されます.したがって、同じターゲットオブジェクトを使用するスレッドでは、ターゲットオブジェクトのメンバー変数は自然にこれらのスレッドが共有するデータユニットです.
    また、ターゲットオブジェクトを作成するクラスは、必要に応じて特定のサブクラスであってもよいので、Runnableインタフェースを使用すると、Threadを使用するサブクラスよりも柔軟性があります.
    public class MyThread extends OtherClass implements Runnable {  
      public void run() {  
       System.out.println("MyThread.run()");  
      }  
    }
    
    
    //     Runnable target   Thread ,Thread run()      target.run(),  JDK   :
    public void run() {  
      if (target != null) {  
       target.run();  
      }  
    }