php网站开发软件,python网站开发集成环境,惠州网站建设选惠州邦,中国企业500强营业收入线程创建之源 OK#xff01;咱们闲话少叙#xff0c;直接进入正题#xff0c;回顾一下通过实现Runnable接口#xff0c;重写run方法创建线程的方式#xff0c;真的可以创建一个线程吗#xff1f;来看下面这段demo。
【代码示例1】 public class Test implements Runnab…线程创建之源 OK咱们闲话少叙直接进入正题回顾一下通过实现Runnable接口重写run方法创建线程的方式真的可以创建一个线程吗来看下面这段demo。
【代码示例1】 public class Test implements Runnable{public static void main(String[] args) {Test test new Test();test.run();}Overridepublic 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();}Overridepublic 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中的runCallable中的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 体验地址引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构