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");
   }
}

有人可以解释上面代码的第二行在做什么吗?我对“th = new Thread(this,threadName)”的理解是,它将创建具有给定名称的线程对象;让我们说名称“第一个线程”。现在,“this”关键字在这里做什么?因为当我删除它并尝试获取线程的名称时,我得到的名称没有问题,但它从未开始运行()。有人可以解释一下简单来说,而不是单行答案。我真的很感谢大家的帮助。

4

5 回答 5

3

th = new Thread(this, threadName); //<----疑问

Thread您的第二行是用您的GetCurrentThread类作为目标 ( this) 和线程名称构造一个新对象"threadName"。您this可以成为目标,因为它实现了Runnable. 在Thread类内部,当线程启动时,它会调用Thread.run()which:

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

GetCurrentThread是目标,因为你传递this给构造函数。真的应该调用GetCurrentThread它,因为它不是线程。构建完 2 行代码后Thread,开始运行:

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);

在上面的行"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对象是创建和启动线程的类GetCurrentThread 本身(即 Runnable)的实例。所以这里 this代表的实例 GetCurrentThread

Runnable.run()方法实际上是一个线程(由对象表示)要执行的任务Thread如果您传递 null 而不是它,则不会有任何任务要线程执行,因此不会run()调用任何方法。

于 2012-06-05T12:50:32.823 回答