【Java面试题】线程中start方法和run方法的区别?

文章讲述了Java中start()方法用于启动新线程并进入就绪状态,与run()方法的区别在于start()会调用run()并启动线程,run()则是普通方法,不启动线程。示例代码展示了直接调用run()会导致线程执行顺序而非并发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

start

start作用是启动一个新线程。

当用start()开始一个线程后,线程就进入就绪状态,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。但是这并不意味着线程就会立即运行。只有当CPU分配时间片时,这个线程获得时间片时,才开始执行run()方法。start()不能被重复调用,它调用run()方法,run()方法是你必须重写的。

run

run()就和普通的成员方法一样,可以被重复调用。

如果直接调用run方法,并不会启动新线程!程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到多线程的目的。

调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。

start()和run()方法的区别:

  1. start方法用来启动相应的线程;
  2. run方法只是thread的一个普通方法,在主线程里执行;
  3. 需要并行处理的代码放在run方法中,start方法启动线程后自动调用run方法;
  4. run方法必须是public的访问权限,返回类型为void。

参考示例代码:

package com.zeus;

class TestCall extends Thread {
    public void run() {
        System.out.println("running...");
    }

    public static void main(String args[]) {
        TestCallRun1 t1 = new TestCallRun1();
        t1.run();// fine, but does not start a separate call stack
    }
}

执行上面示例代码,得到以下结果:

running...

如果直接调用run()方法,则会出现问题。参考以下示例代码:

package com.zeus;

class TestCall extends Thread {
    public void run() {
        for (int i = 1; i < 5; i++) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                System.out.println(e);
            }
            System.out.println(i);
        }
    }

    public static void main(String args[]) {
        TestCallRun2 t1 = new TestCallRun2();
        TestCallRun2 t2 = new TestCallRun2();

        t1.run();
        t2.run();
    }
}

执行上面示例代码,得到以下结果:

1
2
3
4
1
2
3
4

正如在上面的程序中看到的那样,程序执行并没有上下文切换,因为这里t1t2将被视为普通对象而不是线程对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值