JavaTutorial-スレッドの名前を取得

15422 ワード

文書ディレクトリ

  • スレッドの名前
  • を取得
  • 方法1
  • テストのコードは以下の通りです:
  • の結果は以下の通りである:
  • まとめ:
  • 方法二
  • テストのコードは以下の通りです:
  • の結果は以下の通りである:
  • まとめ
  • スレッドの名前を取得


    方法1

    public class ExampleCurrentThread extends Thread{
    
        public ExampleCurrentThread(){
            System.out.println(" :" + Thread.currentThread().getName());
        }
    
        @Override
        public void run() {
            super.run();
            System.out.println("run :" + Thread.currentThread().getName());
        }
    }
    

    テストのコードは次のとおりです。

    public class ExampleCurrentThreadTest extends TestCase {
    
        public void testInit() throws Exception{
            ExampleCurrentThread thread = new ExampleCurrentThread();
        }
    
        public void testRun() throws Exception {
            ExampleCurrentThread thread = new ExampleCurrentThread();
            thread.start();
            Thread.sleep(1000);
    
        }
    
    }
    

    結果は次のとおりです。

     :main       --->testRun()
    run :Thread-0    --->testRun()
     
    
    
     :main       --->testInit() 
    

    まとめ:


    ExampleCurrentThread内部用Thread.CurrentThread()は、構造方法の印刷がmainであることを示す.CurrentThread()は、コードセグメントがそのスレッドによって呼び出されている情報を返します.ここでは構造方法がmainスレッドによって実行されていることは明らかですが、runメソッドは私たちが起動したスレッドによって実行されています.彼に名前を付けていないので、デフォルトはThread-0です.次の

    方法2

    public class ComplexCurrentThread extends Thread{
    
        public ComplexCurrentThread() {
            System.out.println("begin=========");
            System.out.println("Thread.currentThread().getName=" + Thread.currentThread().getName());
    
            System.out.println("this.getName()=" + this.getName());
            System.out.println("end===========");
        }
    
        @Override
        public void run() {
            super.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 class ComplexCurrentThreadTest extends TestCase {
    	public void testRun() throws Exception {
            ComplexCurrentThread thread = new ComplexCurrentThread();
            thread.setName("byhieg");
            thread.start();
    
            Thread.sleep(3000);
        }
    }
    

    結果は次のとおりです。

    begin=========
    Thread.currentThread().getName=main
    this.getName()=Thread-0
    end===========
    run begin=======
    Thread.currentThread().getName=Thread-1
    this.getName()=byhieg
    run end==========
    

    まとめ

  • オブジェクトを作成するとき、コンストラクタはmainスレッドによって実行されるので、Thread.CurrentThread()はMainスレッドの名前を取得しますが、thisメソッドはメソッドを呼び出すオブジェクト、つまりComplexCurrentThreadのスレッド情報を指し、まだsetNameがないのでデフォルトの名前です.
  • run法はThread.CurrentThread()またはthisはbyhieg名が設定されたスレッド情報を返します.だからCurrentThreadとは、このコードブロックを具体的に実行するスレッド情報
  • を指す.
  • thisで得られる情報は、runでthisを実行した場合、正確ではありません.getName()ですが、runメソッドは別のスレッドstartによって行われています.私たちはthisを通過できません.getNameはrunメソッドを実行するニュータウンの情報を取得します.さらにThreadを継承したクラスだけがgetNameなどの方法を持つことができ、Javaがあまり継承していない特性言語にとっては災難である.