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方法的含义:

  1. 通知jvm在有空闲的情况下, 启动新的线程 . 至于什么时候去运行这个线程,是由线程的调度器去决定的 . 因此调用start方法的顺序, 并不能决定执行顺序.
  2. 由main线程去做一些准备工作,让新创建的线程能够去运行
    让线程处于就绪状态.
  3. 不能重复执行start方法
    两次执行start方法, 报错如下 . java.lang.IllegalThreadStateException非法的线程状态异常. 线程执行完毕, 变成终止状态, 不可能再次变成就绪状态, 因此抛出异常.

start方法源码分析. start方法的源码, 会有如下的几个步骤:

  1. 启动柜新线程, 检查线程状态
  2. 加入线程组
  3. 调用start0()
    具体的源码如下.
    启动可以看到 start0方法为native方法

为什么 run()方法不是启动线程的方式

Thread 类的run方法如下.

此run有两种情况

  1. 如果是实现Runnable接口的方式创建线程, 那么此处的run方法就会传入target
  2. 如果是继承Thread类的方式创建线程, 那么此run方法会完全被重写.

通过源码可以看出, 此方法完全没有创建线程的代码. 只是一个普通的方法而已. 不会像start方法, 去调用native方法, 去启动线程.

转载地址:https://javaweixin6.blog.csdn.net/article/details/108041958 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java 如何正确的停止线程
下一篇:程序员的学习路径&如何从业务开发中快速成长

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月12日 02时18分27秒