写点什么

Java 面试挂在线程创建后续,不要再被八股文误导了!创建线程的方式只有 1 种

作者:EquatorCoco
  • 2024-03-08
    福建
  • 本文字数:1373 字

    阅读完需:约 5 分钟

线程创建之源


OK!咱们闲话少叙,直接进入正题,回顾一下通过实现 Runnable 接口,重写 run 方法创建线程的方式,真的可以创建一个线程吗?来看下面这段 demo。

【代码示例 1】


public class Test  implements Runnable{     public static void main(String[] args) {        Test test = new Test();        test.run();    }    @Override    public void run() {       	System.out.println(Thread.currentThread().getName()+":"+"runnable线程");    }}
复制代码


输出:


main:runnable线程
复制代码


虽然这里我们实现了 Runnable 接口并重写了 run 方法,但执行结果中输出的线程却是主线程,这可我们调用普通的方法一样,仍旧依靠的主线程驱动,那怎么样创建一个线程呢?

【代码示例 2】


public class Test  implements Runnable{     public static void main(String[] args) {        Test test = new Test();        new Thread(test).start();    }    @Override    public void run() {        System.out.println(Thread.currentThread().getName()+":"+"runnable线程");    }}
复制代码


输出:


Thread-0:runnable线程
复制代码


这个 demo 中,我们在外面套了一层 Thread,然后调用 start 方法,最终输出的结果就是一个全新的 Thread-0 线程,从而实现了线程的创建。


得出结论


我们继续换 Callable、FutureTask、ThreadGroup、匿名内部类或 Lambda 表达式等类或接口,发现均无法直接创建一个线程,必须借助 Thread 的 start();

而例如 ExecutorService 线程池、ForkJoin 线程池、CompletableFuture 类、Timer 定时器类、parallelStream 并行流等等,如果有去看过它们源码的小伙伴应该清楚,它们最终都依赖于 Thread.start()方法创建线程。


因此,我们在这里可以大胆的得出这样的一个结论:

在 Java 中创建线程的方式只有一种:通过 Thread.start()调用 start()方法,会启动一个线程并使线程进入就绪状态,当分配到时间片后开始运行。 start() 会执行线程的相应准备工作,然后自动执行 run() 方法的内容


线程体与线程的区别


文章写到这里,我们一起再来思考一个问题,既然 Runnable 和 Callable 接口和 Thread 类一样需要重写他们提供的 run()/call()方法,又没有创建线程,那它们究竟做了什么呢?这个直接给出答案:他们经过重写,确定了线程体,那线程体与线程又有何区别?我们来看看文心一言怎么说。



总结一句话:线程体是线程的核心部分,负责执行线程的具体任务。

所以说无论是 Thread 中的 run 还是 Runnable 中的 run,Callable 中的 call 方法,内部所实现的都是线程需要执行的具体内容也就是线程体


总结


基于以上的分析,若我们在面试中再次遇到:“Java 线程有几种创建方式?”的考题,就可以这样回答啦:

Java 中创建线程的方式有很多种,在《Java 技术卷》和《Java 编程思想》中提供了实现 Runnable、Callable 接口、继承 Thread 类、创建线程池这四种常见方式,我们还可以通过 ForkJoin 线程池、CompletableFuture 类、Timer 定时器类、parallelStream 并行流、匿名内部类或 Lambda 表达式等多种方式去实现,但这些都不是真正意义上的创建线程,严格意义上,Java 创建线程的方式只有一种那就是通过 new Thread().start()创建,Runnable、Callable 接口只是重写了线程的线程体,用来确定我们线程需要执行的内容。


文章转载自:JavaBuild

原文链接:https://www.cnblogs.com/JavaBuild/p/18060227

体验地址:http://www.jnpfsoft.com/?from=001

用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
Java面试挂在线程创建后续,不要再被八股文误导了!创建线程的方式只有1种_Java_EquatorCoco_InfoQ写作社区