面试官:聊聊多线程的几种创建方式?

前言

多线程是计算机编程的一个重要概念,它允许程序同时执行多个任务,从而提高程序的效率和系统资源的利用率。多线程也是面试当中,经常会被面试官问到的一个基础知识点,今天我们来简单讨论讨论多线程以及多线程的几种创建方式。

喜欢的朋友可以先点个关注,然后接着往下看。

目录

1、什么是多线程?

2、并行和并发是什么?

3、多线程有几种创建方式?

    3.1、继承Thread类

    3.2、实现Runnable接口

    3.3、Callable接口+future

    3.4、三种多线程实现方式的区别

一、什么是多线程?

多线程,说的通俗易懂点,就是将多个任务,一起执行。举个例子,一家饭馆的后厨,只有一个厨师既要负责炒菜、切菜、洗菜,又要负责端菜,那么他的工作效率明显是非常低的,老板为了提高工作效率,又重新招聘了一个副手和服务员,厨师只负责炒菜,副手负责切菜和洗菜,服务员负责把炒好的菜端到餐桌,我们可以把厨师、副手、服务员看成执行不同任务的单线程,在服务员端菜的时候,厨师在炒下一份要端上卓的菜,副手负责把下一份要炒的菜洗好、切好,保证了各个角色负责各自的工作,同时执行,这就是多线程,提高资源利用率和工作效率。

总结:

    1、什么是多线程:同时让程序做多件事情

    2、多线程的作用:提高程序运行效率

二、并发和并行是什么?

多个任务,在同一个处理器上执行,逻辑上的同时发生,比如,一个人同时吃三个苹果,我们可以把它看成并发,而多个任务,同时在多个处理器上执行,这是物理上的同时发生,比如:三个人同时吃三个苹果,我们把它叫做并行。注意:并行不一定会比并发执行效率高,主要取决于处理器的执行能力。

总结:

    1、并发:多个任务在一个处理器上执行

    2、并行:多个任务在多个处理器上执行

三、多线程的几种创建方式

3.1、继承Thread类实现多线程

Thread类是java为我们提供的一个线程实现类,我们可以通过创建一个类去继承这个Thread类,并且重写父类Thread的run方法,需要异步执行的线程代码,我们可以放在这个run方法里面,具体代码如下:

第一步:创建一个类,继承Thread类,并重写run方法,run方法是多线程执行代码体,需要异步执行的线程代码,我们可以放在这里面。本案例实现了一个间隔1s左右打印输出"你好,我是多线程"+线程名 的功能

第二步:实例化创建的类,并调用start()方法,执行线程

需要注意的是,执行线程的代码是start方法,而不是run(),如果调用的是run方法,那么,运行时会和普通代码一样,不会创建多个线程。

运行结果

通过运行结果可以看出,线程创建成功,并且通过调用start方法,执行了我们重写的run方法,同时两个不一样的输出在交替执行,这个和线程优先级的知识有关,以及关于Thread类的相关方法、属性,考虑到时间原因,这里就不一一描述了,感兴趣的可以先关注一下,后期为您讲解。

3.2、实现Runnable接口

Runnable是一个接口,它继承于Thread类,我们可以通过实现runnable接口,并且实现它的run方法,实现多线程。具体代码如下:

第一步:创建一个类,实现Runnable接口,并且实现它的run方法,需要注意的是,这次是实现Runable接口,所以代码中不能直接调用tihs.getName()方法获取线程名,我们需要通过Thread.currentThread().getName()方法来获取线程名,或者直接自己定义,并在创建实现类对象的时候传入(案例中属于自定义)。

第二步:实例化创建的Runnale实现类、实例化一个Thread对象,并通过构造方法将前面创建的实现类传入Thread对象,然后调用Thread对象的start()方法,执行线程

执行结果

3.3、Callable接口+future

我们可以发现前面两种实现方式,其实无法知道线程的执行结果,因为它们的线程执行体run方法,都是无返回值的。但是很多场景,我们需要获得执行结果,那么,我们可以通过实现Callable接口+FutureTask的方式,实现多线程。具体代码如下:

第一步:创建一个类,实现Callable接口,这是一个泛型接口,我们可以指定类型为我们需要的线程执行结果的类型。然后实现call方法,我们可以在方法体里面实现多线程代码,方法返回类型为我们指定的泛型接口类型。本案例实现了一个将初始值为0的值不断递增,直到等于30的时候,结束,并返回值的功能。

第二步:实例化创建的Callable实现类、实例化一个FutureTask对象,并通过构造方法将前面创建的实现类传入FutureTask对象,然后将FutureTask对象通过Thread类构造器传入实例化的Thread对象,并调用Thread对象的start()方法,执行线程

执行结果:

我们在主方法中成功创建并执行了多线程,并获取到了线程执行结果

3.4、三种多线程实现方式的区别

    1、通过继承Thread类或者实现Runable方法来实现多线程的方式,无法获取执行结果。

    2、通过实现 Runnable、Callable 接口的方式创建多线程时,线程类只是实现了接口,还可以继承其他类。

    3、其实三种方法都需要围绕Thread类来实现,所以,我认为学好多线程,要先把核心Thread类理解通透,大家可以先关注我,后面将会详细介绍有关Thread类的使用,以及线程优先级等相关知识。

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值