当编译并运行下面程序时会发生什么结果()
public class Bground extends Thread{ public static void main(String argv[]){ Bground b = new Bground(); b.run(); } public void start(){ for(int i=0;i<10;i++){ System.out.println("Value of i = "+i); } } }
说一说我自己的理解。
这题可以用面向对象的思想即可解决
首先继承Thread,然后调用run方法,bgroud并没有重写run方法,那么就是调用父类Thread的run方法。
然后查看父类代码
@Override
public void run() {
if (target != null) {
target.run();
}
}
private Runnable target;
其中target是Runnable对象
明显target并没有显示初始化。
所以不会有显示。
一般target的初始化是这样的,将runnable对象作为thread参数进行线程的创建
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
再看init()
private void init(ThreadGroup g, Runnable target,String name,long stackSize) {
init(g, target, name, stackSize, null);
}
在init(g, target, name, stackSize, null),可以找到this.target = target;
此时进行了初始化。
最后说一说,Thread 的执行过程,Theard的启动方法是start().线程类调用start();然后执行start0()本地方法,然后就没办法再追溯下去了。
start我听过别人说,是一个准备工作(比如你要吃苹果,不得先洗一下,真正吃时间是洗完后),并没有获得cpu,调用run()才是获得了cpu。
public Thread() { init(null, null, "Thread-" + nextThreadNum(), 0); }
private void init(ThreadGroup g, Runnable target, String name, long stackSize) { init(g, target, name, stackSize, null); }
public class Thread implements Runnable