Thread构造函数与字符串param有什么用?

时间:2014-08-08 16:38:04

标签: java multithreading

查看Thread构造函数,我看到有一个需要单个字符串参数。我有下面的代码,这是没用的。我想知道,如何有效地利用这个构造函数并实际运行

public class ThreadTest {
  public static void main(String[] args) {
    Thread t = new Thread("abc");
    t.start();
    System.out.println("Complete");
  }
}

或者它不应该按我上面演示的方式使用吗?

我完全知道如何编写多个线程并执行:),我只是想了解这个构造函数的正确用法?它是否应仅通过扩展线程调用super(name)来使用,而不是通过我在上面使用它的方式来使用。

3 个答案:

答案 0 :(得分:3)

线程类本身并没有做那么多。您必须扩展它或围绕runnable构造它以使其在运行时执行任务。来自doc:

start():"使该线程开始执行; Java虚拟机调用此线程的run方法。"

run():"如果使用单独的Runnable运行对象构造此线程,则调用该Runnable对象的run方法;否则,此方法不执行任何操作并返回。"

因此,以您的方式构建一个新线程并启动它不会做任何事情。 Thread(String)构造函数的一个用法是在子类中:

public class Worker extends Thread{

    public Worker(int numb){
        super("worker-"+numb);
    }

    @Override
    public void run(){
        //Stuff this thread actually does when run
        //....
        for(int i = 0; i < 10; i++)
            System.out.println(Thread.currentThread().getName() + ":" + i);
    }
}

要回答评论中的第二个问题,您可以编写并行执行的代码。考虑上面的类加上这个主要方法:

public static void main(String[] args){
    Worker w1 = new Worker(1);
    Worker w2 = new Worker(2);
    w1.start();
    w2.start();
}

w1和w2的运行方法将并行执行。 print方法的顺序因主方法的执行而异。

答案 1 :(得分:2)

此特定构造函数用于指定线程的“名称”,稍后可用于区分特定线程类型的实例。

From the official Java API documentation;

  

     
     

公共线程(字符串名称)

     

分配一个新的Thread对象。这个   构造函数与Thread具有相同的效果(null,null,name)。

     

参数名称 - 新主题的名称

分配Thread名称后,可以调用getName()实例上的Thread方法,以返回创建时给出的名称。这对于调试或区分相同Thread子类类型的实例非常有用。

额外阅读:

答案 2 :(得分:0)

如果您只是调用此构造函数,则会得到一个Thread,它什么都不做。为什么?查看java.lang.Thread的源代码。它有一个private Runnable target;类变量。当您调用此构造函数时,target变量仍设置为null(因为此构造函数只是设置Thread的名称)。

此外,run()的{​​{1}}方法如下所示:

java.lang.Thread

因此,这意味着此public void run() { if (target != null) { target.run(); } } 方法无效,因为run()target

为了创建/启动一个真正做一些有用的事情的null,请阅读:

The Java tutorial - how to run a thread?