实现多线程的方法(附Oracle官方解释以及面试回答方法)

一、实现多线程究竟有多少种方法

百度一下有很多不同的文章,有说一种的有说两种的也有说四种的,这让很多不了解多线程想要入门的猿猿们很头疼。
在这里插入图片描述
上面是2020年1月8号搜索的百度,可以看到如果没有了解并且想要了解的猿猿们如果看到这些会立马丧失大半的学习激情吧,本文没有批判其他文章的作者的意思,仅仅通过官方的文档最直接了当的告诉大家正确的思路以及使用方法。
正确答案是:两种
在回答面试的时候,我们可以说一种:“新建Thread类,两种run()方法的实现方式来实现多线程创建”,然后细分为两种,后面有介绍,细品。



可以看到官方文档上已经给出了明确答案,下面我们将围绕这两种方法进行展开分析:

  • 继承Thread类,重写run()方法。
  • 实现Runnable接口,实现run()方法。

二、实现Runnable接口


截取了自己的代码片段来做讲解

  1. 首先我们自己创建一个RunnableStyle类来实现Runnable接口,要求我们重写run方法,我们再run方法中打印。
  2. new Thread将我们新创建的类作为参数传入,调用start方法开启线程。

我们通过IDEA的快捷键(ctrl+F12)查看Thread中的run方法。

我们可以看到重写了run方法,如果target不等于null,那么执行run。
那么target是什么呢,我们再看一张图。

通过源码我们可以看到target就是我们的Runnable类。

所以我们看到在执行Thread thread = new Thread(new RunnableStyle());这个代码时Thread类会先判断是否为null。然后执行。

二、继承Thread

同样截取了代码片段供大家参考:

代码看起来比实现Runnable接口少一点,不用newThread()传入参数。但通通过上面源码我们可以了解到,继承了父类那么子类重写父类run()方法时,必将覆盖父类方法。也就是说不等于null的判断被我们的程序(代码中是打印)取代。在某些角度来说,是不好的。 所以给大家总结一下两种实现多线程方法具体的优缺点以及区别之处。

三、两种方法的比较

大家仔细阅读,相信对理解有很大的帮助

  • 继承Thread方法是不推荐的,推荐我们创建多线程时使用实现Runnable的方法,原因有一下几点:
  1. 从代码架构角度来说:具体的任务(run方法)应该跟“创建跟运行线程的机制(也就是Thread类)”解耦,用runnable对象可以实现解耦。
  2. 大量使用Thread类会提高损耗,因为只要想新建一个任务就要新建一个线程。而不如用线程池和runnable对象损耗低。
  3. 继承Thread方法后我们没办法再继承别的方法了,因为java不支持双继承。程序拓展性变低。

以上总结而言:推荐使用实现Runnable接口的方法来创建新的线程。

面试回答:

做几点补充:

  • 肯定有同学会否定创建线程的两种方式,其实我想说想现在大众化理解的创建多线程的方法与本文有很大的出入,比如:定时器,lambda表达式,线程池等等都可以创建新线程,这么说也没错,但是看过源码不难发现最终都会去实现Runnable这个类。随着技术的发展与迭代,还会有越来越多的包装类、甚至像lambda表达式这样新的语法,更简单更便捷的去实现一个线程的创建,但万变不离其宗吧。本文也是让一些从没接触过多线程的同学可以有一个系统的了解以及面试更具体的答出面试官想要的答案。
  • start()方法的使用,当一个线程对象创建好之后,我们会通过.start()方法去启动而不是run()。但是同一个线程并不能启动两次,也就是说调用两次start方法。我们从源码的角度出发。

    在执行start方法时会检测当前线程的状态,如果不是初始化的0,则会报错

    以上便是线程的创建以及启动的各种知识点吧,希望对大家有帮助,如果本人有不对的地方,或者各位有不同的见解,欢迎在评论区提出来。我们共同探讨。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
阿里反洗钱是指阿里巴巴集团在电子商务和数字支付领域,利用技术手段预防和打击洗钱活动的一套系统和措施。该系统主要运用Java编程语言进行开发,以下是对阿里反洗钱Java面试回答: 阿里反洗钱Java面试主要涉及对Java编程语言的熟练运用和相关技术的理解。首先,面试官可能会问到对Java的基本概念和特点的了解,如面向对象、跨平台性等。同时,还可能会问到对Java集合框架和多线程编程的理解和应用。 然后,面试官可能会问到与反洗钱系统相关的技术问题。这包括对于防范和识别洗钱活动的算法和模型的理解。一些常见的算法和模型包括关联规则、决策树和神经网络等。在回答问题时,可以结合实际项目经验,举例说明如何利用Java编程语言实现这些算法和模型。 此外,面试官可能会询问与数据处理和存储相关的问题。反洗钱系统需要对大量的交易数据进行处理和存储,因此对于数据库和缓存技术的了解是很重要的。对于Java开发人员来说,熟悉MySQL、Oracle等关系数据库和Redis、Memcached等缓存工具是必备的技能。 最后,面试官可能会问到与系统架构和性能优化相关的问题。阿里反洗钱系统需要处理大量复杂的数据和高并发的请求,因此对于分布式系统和负载均衡等技术的理解是必要的。此外,性能优化是Java开发中重要的课题之一,对于JVM的调优和代码优化的知识也会成为面试的重点内容。 综上所述,阿里反洗钱Java面试主要涉及Java编程语言的基本概念和特点、与反洗钱系统相关的算法和模型、数据处理和存储技术、系统架构和性能优化等方面的知识。准备面试时,应该充分准备这些内容,结合实际经验和项目案例进行回答,展示自己在Java开发领域的实力和能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值