Javaマルチスレッドプログラミング学習(二)


スレッドの紹介とマルチスレッドの使用(トランスポートゲート)
一、currentThread()方法
        CurrentThread()メソッドは、コードセグメントがどのスレッドによって呼び出されているかの情報を返すことができる.
1.テストコードを貼り付ける
public class MyThread extends Thread {

	public MyThread(){
		System.out.println("       :" + Thread.currentThread().getName());
	}
	@Override
	public void run(){
		System.out.println("run     :" + Thread.currentThread().getName());
	}
	
	public static void main(String[] args) {
		MyThread mythread = new MyThread();  //   main        
		mythread.start();     //       ,      mythread   run  
		//mythread.run();     //   main    run  

	}

}

        MyThread.javaクラスのコンストラクション関数はmainスレッドによって呼び出され、runメソッドはThread-0という名前のスレッドによって呼び出され、runメソッドは自動的に呼び出されるメソッドです.ただし、mainメソッドでコードmythread.run()が呼び出されると、runメソッドはmainスレッドによって呼び出されます.(詳細はマルチスレッド学習(一)を参照)
 
2.テスト用のJavaファイルCountOperate.javaを作成する複雑な状況をテストします.
public class CountOperate extends Thread {

	public CountOperate(){
		System.out.println("CountOperate---begin");
		System.out.println("Thread.currentThread().getName()=" +
				Thread.currentThread().getName());
		System.out.println("this.getName()=" + this.getName());
		System.out.println("CountOperate---end");
		
	}
	@Override
	public void run(){
		System.out.println("run---begin");
		System.out.println("Thread.currentThread().getName()=" +
				Thread.currentThread().getName());
		System.out.println("this.getName()=" + this.getName());
		System.out.println("run---end");
	}
	
	public static void main(String[] args) {
		CountOperate c = new CountOperate();
		Thread t1 = new Thread(c);
		Thread t2 = new Thread(c);
		t1.setName("A");
		t1.start();
		t2.start();

	}

}
//    
CountOperate---begin
Thread.currentThread().getName()=main
this.getName()=Thread-0
CountOperate---end
run---begin
Thread.currentThread().getName()=A
this.getName()=Thread-0
run---end

3.マルチスレッドプログラミングThread.currentThread().getName()とthis.getName()の違い
        上記の例から分かるように、クラスの構築方法はmainスレッドによって呼び出され、Thread-0という名前のスレッドが作成され、スレッドThread-0によってスレッドThread-1とThread-2が作成され、Thread-1のスレッド名がAに変更される(このときThread-0のアクティブ状態は終了している).this.getName()がスレッド名をThread-0として出力するのは、JVMがスレッドがどこまで実行されているのか分からないため、Thread.currentThread().getName()を使用してこそ、現在実行中のスレッド名を正確に得ることができる
 
二、 isAlive()メソッドとsleep()メソッド
        メソッドisAlive()の役割は、スレッドがアクティブかどうかをテストすることです.アクティブなステータスは、スレッドが起動して終了していない状態であり、スレッドが実行中または実行開始の準備ができている状態である場合、スレッドは「生存」しているとみなされます.
        メソッドsleep()の役割は、指定したミリ秒数で現在の「実行中のスレッド」をスリープさせることです(実行を一時停止します).この「実行中スレッド」とは、this.currentThread()が返すスレッドのことです.
public class MyThread extends Thread {

	@Override
	public void run(){
		try{
			System.out.println("begin Alive =" + Thread.currentThread().isAlive());
			System.out.println("run threadName=" +
					Thread.currentThread().getName() + " begin =" +
					System.currentTimeMillis());
			Thread.sleep(1000);
			System.out.println("end Alive =" + Thread.currentThread().isAlive());
			System.out.println("run threadName=" +
					Thread.currentThread().getName() + " end =" +
					System.currentTimeMillis());
		}catch(InterruptedException e){
			e.printStackTrace();
		}
		
	}
	
	public static void main(String[] args) throws InterruptedException{
		MyThread c = new MyThread();
		c.start();
		Thread.sleep(2000);
		System.out.println("c Alive =" + c.isAlive());
		
	}

}
//    
begin Alive =true
run threadName=Thread-0 begin=1462250706904
end Alive =true
run threadName=Thread-0 end=1462250707905
c Alive =false

        システム呼び出しスレッドrunメソッドの実行開始時間と終了時間の差は1000ミリ秒で、両方の時間スレッドがアクティブです.mian関数のスレッドアクティビティ状態はfalseであり、cオブジェクトは2秒以内に実行されたため(1秒の眠りを含む)
 
参考文献:
『Javaマルチスレッドプログラミングコアテクノロジー』