Java启动线程的正确方式 & 为什么 run()方法不是启动线程的方式
发布日期:2021-06-30 13:11:42
浏览次数:2
分类:技术文章
本文共 973 字,大约阅读时间需要 3 分钟。
文章目录
启动线程方式的示例
如下的代码示例. 使用lambda表达式 方式, 实现了Runnable 接口.
分别用 run方法和start方法去启动线程public class StartAndRunMethod { public static void main(String[] args) { Runnable runnable = () -> { System.out.println(Thread.currentThread().getName()); }; runnable.run(); new Thread(runnable).start(); }}
运行程序, 可以看到 run方法打印的线程名称为main线程, 并没有起一个新的线程. 而start方法才是启动了一个新的线程.
start方法解读
start方法的含义:
- 通知jvm在有空闲的情况下, 启动新的线程 . 至于什么时候去运行这个线程,是由线程的调度器去决定的 . 因此调用start方法的顺序, 并不能决定执行顺序.
- 由main线程去做一些准备工作,让新创建的线程能够去运行 让线程处于就绪状态.
- 不能重复执行start方法 两次执行start方法, 报错如下 .
java.lang.IllegalThreadStateException
非法的线程状态异常. 线程执行完毕, 变成终止状态, 不可能再次变成就绪状态, 因此抛出异常.
start方法源码分析. start方法的源码, 会有如下的几个步骤:
- 启动柜新线程, 检查线程状态
- 加入线程组
- 调用start0() 具体的源码如下. 启动可以看到 start0方法为native方法
为什么 run()方法不是启动线程的方式
Thread 类的run方法如下.
此run有两种情况- 如果是实现Runnable接口的方式创建线程, 那么此处的run方法就会传入target
- 如果是继承Thread类的方式创建线程, 那么此run方法会完全被重写.
通过源码可以看出, 此方法完全没有创建线程的代码. 只是一个普通的方法而已. 不会像start方法, 去调用native方法, 去启动线程.
转载地址:https://javaweixin6.blog.csdn.net/article/details/108041958 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2024年04月12日 02时18分27秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Python读取配置文件中文乱码问题
2019-05-01
使用Spark读写外部存储介质(Mysql、Hbase、Redis)
2019-05-01
Spark学习——利用Mleap部署spark pipeline模型
2019-05-01
手写LogisticRegression
2019-05-01
SQL经典题目总结
2019-05-01
剑指offer编程题,一周刷完
2019-05-01
推荐系统初学
2019-05-01
Map的遍历和排序
2019-05-01
约瑟夫环问题
2019-05-01
springboot+log4j2体验
2019-05-01
redis集群启动方式
2019-05-01
ubuntu系统开机自启动方式
2019-05-01
ES查询效率之快的三个重要技术
2019-05-01
JDBC概念,JDBC连接到Oracle 11g(内附驱动jar包),
2019-05-01
彻底卸载MySQL
2019-05-01
Oracle创建表,修改表(添加列、修改列、删除列、修改表的名称以及修改列名)
2019-05-01
SQL命令分类(DDL、DML、DCL、TCL以及事务)
2019-05-01
nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate 报错
2019-05-01
kafka集群搭建
2019-05-01
Python正则表达式,从入门到实战,精华都在这里!
2019-05-01