在下面给出的代码中,我已经在Temp
构造函数调用中传递了Thread
类对象的引用id,这将被Runnable
类型引用变量中的线程类的构造函数捕获。所以我想问一下,Thread
类构造函数中是否有任何代码告诉JVM在创建线程时要执行这个特定类的run()
方法。
class Temp implements Runnable
{
public void run()
{
System.out.println("Hello from a thread!");
}
public static void main(String args[])
{
(new Thread(new Temp())).start();
}
}
答案 0 :(得分:1)
在thread.start()
方法内,线程调用runnable.run()
。
一种简单的方法,它可以如何工作但实际上,由于这个例子没有创建新的线程,所以没有这样做,是
public class Thread {
private Runnable runnable;
public Thread(Runnable runnable) {
this.runnable = runnable;
}
public void start() {
if (runnable != null) {
runnable.run();
}
}
}
然后当你打电话:
new Thread(this).start();
将创建一个新的线程,将 Runnable 分配给内部私有成员。稍后,在创建对象后,将在对象上调用start()
,该对象将查找私有runnable
成员,并将其称为run()
方法。
答案 1 :(得分:0)
start()是开始使用在方法run()中指定的线程的命令。每当调用start()时,它将在run()方法中执行代码。
答案 2 :(得分:0)
您传递了Temp
Thread
Runnable
Thread.start
对象。 run
会调用Runnable
的{{1}}方法,因此Temp.run
会被调用。
答案 3 :(得分:0)
Thread
的{{1}}方法调用您传递的对象的start
方法作为构造函数的参数。由于您传递了类run
的对象,因此将调用Temp
的run方法。
答案 4 :(得分:0)
一般情况下会发生什么。
Thread.start()
方法分配堆栈,依此类推。Thread.run()
方法。Thread.run()
,则会调用覆盖run()
方法。
run()
本身实现的Thread
方法。
Thread.run()
方法检查Thread
实例是否有Runnable
实例。Thread.run()
会调用run()
上的Runnable()
方法。Thread.run()
方法只会返回。Thread.run()
方法返回(或异常终止),start()
方法将Thread
标记为不再存活,并释放堆栈并解除与Thread对象关联的其他内容Thread类构造函数中是否有任何代码告诉JVM在创建线程时要执行此特定类的run()方法。
不完全是。构造函数将Runnable
存储在私有变量中,Thread.run()
方法测试私有变量...如果Thread.run()
尚未被覆盖。