线程的 run() 和 start() 有什么区别?

线程的 run() 和 start() 有什么区别? !!!
注:本文转载于:CodeCow · 程序牛 的个人博客:http://www.codecow.cn/

继上一篇 "头发都白了,才知道如何实现多线程 ",有小伙伴私聊小编,线程的 run() 和 start() 有什么区别,空闲之余,写下此文

前言

上篇文章《头发都白了,才知道如何实现多线程》小编用多线程方式实现了边撸代码看岛国大片,但却遗留了一个问题,run() 和 start()到底有什么区别?

回顾Thread

回顾Thread的API
public void start() :导致此线程开始执行; Java虚拟机调用此线程的run方法。 
public void run() :此线程要执行的任务在此处定义代码。 

run() 和 start() 区别

区别:
1、调用 start() 方法是用来启动线程的,轮到该线程执行时,会自动调用 run()
2、直接调用 run() 方法,无法达到启动多线程的目的,相当于主线程线性执行 Thread 对象的 run() 方法
3、一个线程对应的 start() 方法只能调用一次,多次调用会抛出 java.lang.IllegalThreadStateException 异常;run() 方法没有限制

看不懂没事,小编给你整个小总结
1、run()相当于线程的任务处理逻辑的入口方法
2、而start()的作用是启动相应的线程

测试start() 方法 上代码


public class TestThreadByStart {

    public static void main(String[] args) {
        Thread thread = new Thread() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000); //休眠3秒
                    System.out.println("休眠3秒");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Thread running:我还是从前那个少年 ");
            }
        };
        testStart(thread);
    }

    private static void testStart(Thread thread) {
        thread.start(); //调用 start()方法来启动线程,轮到该线程执行时,会自动调用 run()
        try {
            Thread.sleep(1000); //休眠1秒
            System.out.println("休眠1秒");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

start() 方法 测试结果

在这里插入图片描述

测试run() 方法 上代码


public class TestThreadByRun {

    public static void main(String[] args) {
        Thread thread = new Thread() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000); //休眠3秒
                    System.out.println("休眠3秒");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Thread running:我还是从前那个少年 ");
            }
        };
        testRun(thread);
    }

    private static void testRun(Thread thread) {
        thread.run(); //直接调用 run() 方法,相当于主线程线性执行 Thread 对象的 run() 方法
        //休眠1秒
        try {
            Thread.sleep(1000);
            System.out.println("休眠1秒");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

run() 方法 测试结果

在这里插入图片描述

最后

不足之处,还望小伙伴多多谅解;
有错之处,还望小伙伴指出,小编会尽快改正

更多 核武器 尽在小编的公众号:CodeCow,欢迎大家订阅,第一时间获取跟新 ↓↓↓
公众号:CodeCow
《 似水流年,什么都会变,什么又都不会变 ——勿忘初心,继续前行 》

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值