java并发2之启动线程

1、start()和run()方法的比较

/**
 * 描述: 对比start和run两种启动线程的方式
 */

public class StartAndRunMethod {
    public static void main(String[] args) {
        Runnable runnable = () -> {
            System.out.println(Thread.currentThread().getName());//输出执行该语句的线程名
        };
        runnable.run(); //main
        new Thread(runnable).start(); //Thread-0
    }
}

2、start()方法

①含义:启动新线程

调用start()方法,将通知JVM在有空余时间时候创建新线程,调用start()方法的顺序并不能决定执行线程的顺序。

不能重复调用start()方法,在每次启动旧的线程之前,都应该检查线程状态。

源码:1)启动新线程检查线程状态,加入线程组,调用start0()。

 public synchronized void start() {
        if (this.threadStatus != 0) {
            throw new IllegalThreadStateException();
        } else {
            this.group.add(this);
            boolean started = false;

            try {
                this.start0();
                started = true;
            } finally {
                try {
                    if (!started) {
                        this.group.threadStartFailed(this);
                    }
                } catch (Throwable var8) {
                }

            }

        }
    }

    private native void start0();

3、run()方法

   public void run() {
        if (this.target != null) {
            this.target.run();
        }

    }

 像我们刚才runnable.run()。其实就是一个普通的方法run()方法。run()方法的执行线程是主线程。要启动线程,要调用start()来间接调用run()方法。

4、面试

一个线程两次调用start()方法会出现什么情况?为什么?

既然start()方法会调用run()方法,为什么我们选择调用start()方法,而不是直接调用run()方法呢?

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值