public class HelloRunnable implements Runnable {
public void run() {
System.out.println("Hello from a thread!");
}
public static void main(String args[]) {
(new Thread(new HelloRunnable())).start();
} }
根据Java Doc,
Runnable
接口定义了一个方法run
,该方法用于包含在线程中执行的代码。Runnable
对象被传递给Thread
构造函数。因此,在执行HelloRunnable
时,谁调用内部的run
方法呢?在Thread
类中,start
方法如下所示:public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
start0();
if (stopBeforeStart) {
stop0(throwableFromStop);
}
}
从这段代码中,我们可以看到start方法没有调用run()方法。
start0
方法怎么样,它会调用run
方法吗?我的意思是,这里没有什么魔法,对吧?如果run
被调用了,那一定是有人在调用它 :-) - Sergey Kalinichenkoprivate native void More ...start0();
- Avik Duttarun()
方法不是从start()
调用内部调用的。如果线程A调用t.start()
,你肯定不希望线程A调用t.run()
对吧?你希望它被另一个线程调用。但是,t.start()
调用发生在线程A中,并且直接或间接被start()
调用的所有内容都发生在线程A中。t.run()
方法会从其他地方调用。 - Solomon Slow