2
public class GetCurrentThread implements Runnable {
   Thread th;

   public GetCurrentThread(String threadName) {
      th = new Thread(this,threadName); //<----DOUBT 
      System.out.println("get threadname "+th.getName());
      th.start();
   }

  public void run() {
     System.out.println(th.getName()+" is starting.....");
     System.out.println("Current thread name : " + Thread.currentThread().getName());
  }

  public static void main(String args[]) {
     System.out.println("Current thread name : " + Thread.currentThread().getName());
     new GetCurrentThread("1st Thread");
     //new GetCurrentThread("2nd Thread");
   }
}

上記のコードの2行目が何をしているのか誰かが説明できますか?「th=new Thread(this、threadName)」についての私の理解は、与えられた名前でスレッドオブジェクトを作成するということです。名前を「1stThread」としましょう。ここで「this」キーワードは何をしているのでしょうか。これを削除してスレッドの名前を取得しようとすると、問題なく名前が取得されましたが、run()が開始されませんでした。誰かが説明できますか一行の答えではなく、簡単な言葉で。みんなの助けに本当に感謝しています。

4

5 に答える 5

3

th = new Thread(this、threadName); // <----DOUBT

2行目は、クラスをターゲット()とし、スレッド名を。として新しいThreadオブジェクトを作成しています。を実装しているため、ターゲットにすることができます。クラス内では、スレッドが開始されると、次のことを呼び出します。GetCurrentThreadthis"threadName"thisRunnableThreadThread.run()

public void run() {
    if (target != null) {
        target.run();
    }
}

コンストラクターにGetCurrentThread渡すので、あなたがターゲットになります。スレッドではないので、実際には呼び出さないthisでください。を構築した後の2行で、実行を開始します。GetCurrentThreadThread

th.start();

このstart()メソッドは、別の動作するネイティブスレッドを作成する実際の作業を行います。スレッドが最初に行うことは、クラスのrun()メソッドを呼び出すことです。GetCurrentThread

コメントとして、通常、クラスがコンストラクター内でそれ自体を使用することはお勧めしません。start()これに固有の競合状態があり、問題を引き起こす可能性があります。start()あなたの方法を持っている方が良いですGetCurrentThread

/** start the underlying thread */
public void start() {
   th.start();
}

メインは次のようになります。

public static void main(String args[]) {
   System.out.println("Current thread name : " + Thread.currentThread().getName());
   GetCurrentThread thread1 = new GetCurrentThread("1st Thread");
   thread1.start();
}
于 2012-06-05T12:33:47.590 に答える
1

のコンストラクターの最初のパラメーターThreadは、その型がを実装するオブジェクトです。Runnableこれはまさにそれをthis表します。クラス宣言に注意してください。

public class GetCurrentThread implements Runnable

したがって、スレッドが開始するrunと、現在のインスタンス(this)のメソッドが実行されます。

とにかく、私はこの種のコードをできるだけ避けるようにしています。それは混乱につながるだけです。

于 2012-06-05T12:33:37.313 に答える
1

これを試して、

th = new Thread(this,threadName);

上記の行は、 RunnableInterface"this" keywordを持つクラスのオブジェクトを示しています。implemented

今、私はあなたにこれをより詳細に見せようとします:

public class A implements Runnable{

   public void run(){

                // some work
        }


}


public class B {


public static void main(String[] args){

A a = new A;
Thread t = new Thread(a);// a is an obj ref variable of class A which implements Runnable
t.start();

 }

}
于 2012-06-05T13:35:00.857 に答える
0

thisこれがrunメソッドが呼び出されるオブジェクトです。この場合はGetCurrentThreadクラスのインスタンスです。th.start()実行した後、スレッドがすぐに実行を開始するという保証はありません。ここで何が起こるかというと、runメソッドに出力行が表示される前にメインスレッドが実行を終了するということです。mainでオブジェクトを作成した後に追加th.join()して、新しく作成されたスレッドが終了するのを待ちます。

public class GetCurrentThread implements Runnable {
    Thread th;

    public Thread getThread(){
        return th;
    }

    public GetCurrentThread(String threadName) {
        th = new Thread(this, threadName); // <----DOUBT
        System.out.println("get threadname " + th.getName());
        th.start();
    }

    public void run() {
        System.out.println(th.getName() + " is starting.....");
        System.out.println("Current thread name : "
                + Thread.currentThread().getName());
    }

    public static void main(String args[]) {
        System.out.println("Current thread name : "
                + Thread.currentThread().getName());
        GetCurrentThread currentThread = new GetCurrentThread("1st Thread");
        // new GetCurrentThread("2nd Thread");
        try {
            Thread thread = currentThread.getThread();
            if (thread != null) {
                thread.join();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

取得する出力は次のとおりです。

Current thread name : main
get threadname 1st Thread
1st Thread is starting.....
Current thread name : 1st Thread
于 2012-06-05T12:47:02.550 に答える
0

コンストラクターを参照していThread(Runnable target, String name)ます。最初のパラメーターは、メソッドを持つtarget任意のインスタンスです。Runnablerun()

この特定のケースでは、オブジェクトは 、スレッドが作成および開始されるtargetクラス自体(Runnable)のインスタンスです。GetCurrentThreadしたがって、ここで thisはのインスタンスを表します GetCurrentThread

メソッドは、Runnable.run()実際にはスレッド(オブジェクトで表される)によって実行されるタスクです。Thread代わりにnullを渡すと、実行するスレッドへのタスクがなくなるため、run()メソッドは呼び出されません。

于 2012-06-05T12:50:32.823 に答える