Java线程中run和start方法的区别

最近在学Java多线程,看到有些文章(http://mgc.name/article.asp?id=827)理解有误,又不能在原页面发表评论,特记录之.

其中讨论了一道SCJP试题

Which two code fragments will execute the method doStuff() in a separate thread? (choose two)
A. new Thread () {
public void run() { doStuff(); }
};
B. new Thread () {
public void start() { doStuff(); }
};
C. new Thread() {
public void start() { doStuff(); }
}.run();
D. new Thread() {
public void run() { doStuff(); }
}.start();
E. new Thread (new Runnable() {
public void run() { doStuff(); }
}).run();
F. new Thread (new Runnable() {
public void run() { doStuff(); }
}).start();

题目问那两个选项将创建一个新线程执行doStuff方法.该文章说答案有三个:D、E(其实这个答案是错的)、F

说明如下:

E并不会创建新的线程.E中只有一个线程:主线程main.E中,主线程直接调用run()方法输出”doStuff”(并不是输出”doStuff”就表示创建新的线程).直接调用run()函数,这只是调用一个方法而已,程序中依然只有主线程–这一个线程,其程序执行路径还是只有一条,这样就没有达到写线程的目的.只有start()函数才会真正创建新线程.在调用start()的时候,start()函数会首先进行与多线程相关的初始化(这也是为什么不能直接调用run()函数的原因),然后再调用run()函数.测试代码如下:

 
public class MyRunnable {

    public static void doStuff() {
        System.out.println("doStuff");
    }

    public static void main(String[] args) throws Exception{

        new Thread(new Runnable() {
            public void run() {
            	try {
			Thread.currentThread().sleep(10);//注1
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
                doStuff();
            }
        }).start();//注2

        System.out.println("hello");
    }
} 
 

 

我在测试代码中让新创建的线程等待10ms后执行.如果创建子线程成功,”doStuff”就会在”hello”之后输出.否则程序只有一个线程,即主线程.程序只有一条执行线路:顺序执行,主线程等待10ms,然后依次输出”doStuff”,”hello”(“Stuff”在”hello”之前输出)

—————————————————–

<注>

1:让当前线程等待10ms.如果下面是start(),新创建线程等待10ms.若是run()的话,没有创建新线程,只有一个线程:主线程,主线程等待10ms

2:此处用start(),程序创建新线程,然后新线程等待至少10ms,这10ms里主线程先输出”hello”,然后新创建的子线程运行输出”doStuff”.如果用run(),并没有创建新线程.程序只有一个主线程顺序指向,先调用run()函数,然后主线程等待10ms,然后输出”doStuff”,最后输出”hello”.程序只有一条 线.只能顺序执行,先输出”doStuff”,再”hello”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值