首页 > 试题广场 >

当编译并运行下面程序时会发生什么结果()

[单选题]
当编译并运行下面程序时会发生什么结果()
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);
        }
    }
}

  • 编译错误
  • 运行错误
  • 编译通过并输出0到9
  • 编译通过,但无输出
选D

对于线程而言,start是让线程从new变成runnable。run方法才是执行体的入口。
但是在Thread中,run方法是个空方法,没有具体实现。
Bground继承了Thread,但是没有重写run方法,那么调用run方法肯定是无输出。
发表于 2018-06-29 11:19:58 回复(6)

说一说我自己的理解。
这题可以用面向对象的思想即可解决
首先继承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。

发表于 2017-08-03 18:01:33 回复(14)
public class Bground extends Thread{
    public static void main(String argv[]){
        Bground b = new Bground();
        b.start();
    }
    public void run(){
        for(inti=0;i<10;i++){
            System.out.println("Value of i = "+i);
        }
    }
}
如果是这样子,就可以选C了
发表于 2018-06-13 08:56:03 回复(11)
调用了父类的run方法
发表于 2017-08-12 20:26:50 回复(0)
1.extends Thread 没有重写run方法时调用父类的run方法
2.implements Runnable 必须实现run方法
发表于 2018-06-09 17:52:29 回复(0)
主函数中调用的run()方法是继承自Thread类的,并没有实现具体函数内容;而且main函数中并没有调用start()方法,所以整个运行过程中并没有调用start()方法,所以没有任何输出;选D。
发表于 2017-08-01 10:10:02 回复(2)
d,继承thread的run方法
发表于 2017-04-27 08:13:43 回复(0)
1.创建该实例时调用Thread的无参构造器:
    public Thread() {
        init(null, null, "Thread-" + nextThreadNum(), 0);
    }

2.构造器里调用init方法:
private void init(ThreadGroup g, Runnable target, String name,
                      long stackSize) {
        init(g, target, name, stackSize, null);
}

3.该实例调用父类Thread的run方法如下,由于target为null所以没有任何输出
  1.     public void run() {
  2.         if (target != null) {
  3.             target.run();
  4.         }
  5.     }
发表于 2017-08-08 15:36:24 回复(1)
main方法中并没有调用start方法,所有,编译通过,但是没有任何输出。
编辑于 2017-12-05 11:51:16 回复(0)
对于线程而言,start是让线程从new变成runnable。run方法才是执行体的入口。 但是在Thread中,run方法是个空方法,没有具体实现。 Bground继承了Thread,但是没有重写run方法,那么调用run方法肯定是无输出。
发表于 2021-11-03 22:12:32 回复(0)
Thread 类不是抽象类,可以不重载run()方法,也因此没有任何输出
发表于 2017-08-01 19:30:48 回复(1)
选D
发表于 2017-04-27 17:52:29 回复(0)
start方法可以被重写是我万万没想到的
发表于 2022-08-20 19:55:28 回复(0)
Thread 类不是抽象类,可以不重载run()方法,也因此没有任何输出
发表于 2022-08-15 18:05:30 回复(1)
继承thread类,没有写run方法,则调用父类run方法。实现runnable接口必须实现run方法。 对于线程而言,start是让线程从new变成runnable。run方法才是执行体的入口。 但是在Thread中,run方法是个空方法,没有具体实现。 Bground继承了Thread,但是没有重写run方法,那么调用run方法肯定是无输出。
编辑于 2021-08-21 22:23:35 回复(0)
如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。
发表于 2020-03-21 18:25:39 回复(0)
继承于Thread类的run方法没有被重写
发表于 2020-02-24 16:27:01 回复(0)
Thread 类不是抽象类,可以不重写run()方法,也因此没有任何输出
public class Thread implements Runnable 
编辑于 2017-08-10 20:37:26 回复(3)
对于线程而言,start是让线程状态从new变成runnable。run方法才是执行体的入口。 但是在Thread中,run方法是个空方法,没有具体实现。 Bground继承了Thread,但是没有重写run方法,那么调用run方法肯定是无输出。
发表于 2023-04-26 22:50:23 回复(0)
run方法是普通方法, 由于没有重写Thread中的run方法,所以thread中调用子类的run方法执行为空
发表于 2022-10-21 11:22:17 回复(0)