
为什么启动一个线程是start方法而不是run方法
发布日期:2021-05-07 02:38:49
浏览次数:24
分类:精选文章
本文共 1232 字,大约阅读时间需要 4 分钟。
文章目录
1:一个例子来说明你是否启动一个线程
看下面代码演示,我们使用Thread.currentThread().getName()来打印当前线程名字
public class ThreadStartAndRun { public static void main(String[] args) { new Thread(()->{ for (int i=0;i<10;i++){ System.out.println(Thread.currentThread().getName()+":"+i); }7 }).run(); System.out.println("main线程结束"); }}
运行程序
main:0main:1//..main:7main:8main:9main线程结束
第7行,我们用run方法启动,控制台输出的线程名字都是main,说明我们 new Thread根本没有成功启动线程,main线程是我们主线程的名字(运行一个程序就会启动一个主线程),如果我们把第7行的run改为start,来演示,控制台打印如下
public class ThreadStartAndRun { public static void main(String[] args) { new Thread(()->{ for (int i=0;i<10;i++){ System.out.println(Thread.currentThread().getName()+":"+i); }7 }).start(); System.out.println("main线程结束"); }}
main线程结束Thread-0:0Thread-0:1//..Thread-0:7Thread-0:8Thread-0:9
第7行使用了start方法,控制台打印了Thread-0,main线程说明了,我们成功启动了一个名字叫做Thread-0的线程。这才是真正启动了一个线程
总结:start();//启动线程->最终会执行run方法run方法就是一个普通的方法,没有真正的启动一个线程
2:从源码角度看调用start方法为什么会启动一个线程
我们追溯start方法源码,在try语句块中看到了一行代码
start0();
继续追进去start0方法
private native void start0();
native说明start0()是本地方法,是JVM调用,底层是c/c++实现
所以说:真正实现多线程的效果,是start0(),而不是 run()
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月02日 20时26分12秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
AQS相关
2019-03-06
abp(net core)+easyui+efcore实现仓储管理系统——多语言(十)
2019-03-06
WCF学习之旅—第三个示例之一(二十七)
2019-03-06
java ThreadPoolExecutor初探
2019-03-06
Markdown进阶
2019-03-06
快速指数算法
2019-03-06
python去除字符串中的特殊字符(爬虫存储数据时会遇到不能作为文件名的字符串)
2019-03-06
PHP将网址快捷方式保存到桌面
2019-03-06
SpringCloud微服务(03):Hystrix组件,实现服务熔断
2019-03-06
Spring 框架基础(01):核心组件总结,基础环境搭建
2019-03-06
JavaEE基础(02):Servlet核心API用法详解
2019-03-06
SpringBoot2 整合Nacos组件,环境搭建和入门案例详解
2019-03-06
结构与算法(03):单向链表和双向链表
2019-03-06
Hadoop框架:MapReduce基本原理和入门案例
2019-03-06
ThreadPoolExecutor线程池任务执行失败的时候会怎样
2019-03-06
Sentry快速开始并集成钉钉群机器人
2019-03-06
Docker 服务
2019-03-06