查看Thread构造函数,我看到有一个需要单个字符串参数。我有下面的代码,这是没用的。我想知道,如何有效地利用这个构造函数并实际运行
public class ThreadTest {
public static void main(String[] args) {
Thread t = new Thread("abc");
t.start();
System.out.println("Complete");
}
}
或者它不应该按我上面演示的方式使用吗?
我完全知道如何编写多个线程并执行:),我只是想了解这个构造函数的正确用法?它是否应仅通过扩展线程调用super(name)
来使用,而不是通过我在上面使用它的方式来使用。
答案 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
,请阅读: