首页 > 试题广场 >

下列程序的运行结果

[单选题]
下列程序的运行结果
public static void main(String args[]) {
    Thread t = new Thread() {
        public void run() {
            pong();
        }
    };
    t.run();
    System.out.print("ping");
}
static void pong() {
    System.out.print("pong");
}

  • pingpong
  • pongping
  • pingpong和pongping都有可能
  • 都不输出
推荐
B.
这里需要注意Thread的start和run方法
用start方法才能真正启动线程,此时线程会处于就绪状态,一旦得到时间片,则会调用线程的run方法进入运行状态。
而run方法只是普通方法,如果直接调用run方法,程序只会按照顺序执行主线程这一个线程。
编辑于 2015-12-02 19:00:39 回复(13)
该题考察的是线程的启动。
在第7行的时候,调用的是t.run();方法,之间调用run方法就是普通的方法调用而已,所以肯定是先执行pong()再执行System.out.print("ping");
如果第7行换成t.start()方法,答案就应该选择c,因为t.start()后,线程变为就绪状态,什么时候开始执行时不确定的,可能是主程序先继续执行,也可能是新线程先执行。
发表于 2016-04-03 16:08:18 回复(6)
若调用start,则先执行主线程的,后执行子线程的,即结果为pingpong
若调用run,相当于函数调用,顺序执行,即结果为pongping
发表于 2015-08-26 08:52:37 回复(10)
答案:B
注意Thread的start才是正在开启线程,这里用的是t.run(),更本没开启线程,只是调用了run()方法。所以一定是是按顺序输出。
如果是t.start();则选c


我觉得是这样的,希望高手来解答。



发表于 2015-06-06 19:04:33 回复(5)
此题考查Thread类中start()和run()方法的使用的不同。start()方法真正启动线程,让线程处于就绪状态,一旦得到时间片,则会调用线程的run()方法进行到运行状态。而run()方法只是一个普通方法调用而已,可以直接理解为调用方法A()。
类似的考题还有wait()和sleep()方法的比较。

① 这两个方法来自 不同的类 分别是,sleep来自Thread类,和wait来自Object类。


② 锁:  最主要sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

③ 使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。

   synchronized(x){ 
      x.notify() 
     //或者wait() 
   }

发表于 2017-03-21 20:26:51 回复(0)
t.run(),并本没开启线程,所以按程序顺利执行主程序,若为t.start()则为开启该线程,结果为C
发表于 2016-01-11 22:34:51 回复(0)
线程要start()了 才会分配线程  否则是普通函数
发表于 2015-12-11 23:33:11 回复(0)
static 块会在JRM启动时调用一次,所以直接运行static里的代码,然后线程只是run,并不会启动
发表于 2015-12-01 18:18:59 回复(0)
B:线程先运行run方法
发表于 2015-04-22 14:51:40 回复(0)
此刻的run方法只是一个普通的方法,且由主线程顺序执行
发表于 2019-12-03 17:45:02 回复(0)
启动多线程是用start,而直接调用run就和调用其他普通函数一样,让我想起第一次编写多线程的时候,用的就是run(),就是经典的多个线程对同一个静态变量作++运算,还发现为什么不是书上的结果
发表于 2015-06-16 20:39:10 回复(0)
c
发表于 2015-05-22 07:51:36 回复(0)
start
发表于 2022-06-14 12:32:35 回复(0)
应该说这里并不是开启线程(开启线程需要使用start()方法),而是单纯的调用run()方法,所以在主线程中会先调用run()方法,再输出ping,结果就是pongping了
发表于 2022-03-15 13:01:27 回复(0)
就是说run()不行,不能直接启动线程,所以需要按照顺序执行这一个线程,只有用start()才能够真正启动线程。
发表于 2022-02-19 15:46:46 回复(0)
这题比较坑爹,它使用的是t.run而不是t.start()
如果是t.run就是按照方法的执行顺序选择B
但是如果是t.start的话,主线程和子线程的执行顺序是随机的,所以两种情况都有可能,这时候应该选择C
发表于 2018-10-25 18:00:06 回复(0)
注意调用的是run方法,特指某一具体,
publicvoidrun() {
                pong();
            }
t.run()调用的是这个具体的方法。

发表于 2015-11-11 21:57:00 回复(3)
线程的启动时通过Start方法启动的,run方法不需要程序员手动调用,线程启动后会自动调用其run方法,这里线程并没有启动。
java创建线程的两种方法:一种方式是直接继承Thread类,重写run方法;另一种方式实现Runnable接口,并实现接口中的run方法
发表于 2015-09-05 20:37:46 回复(0)
65头像 65
B 亲测无误
发表于 2015-06-03 15:18:28 回复(0)
B start 跟run 是不同的
发表于 2015-05-26 11:15:49 回复(0)
t.start()会启动一个线程,而t.run()本质上还是main线程,t.run()和sout属于同一个线程,按先后顺序执行
发表于 2023-10-08 09:29:23 回复(0)