前言
多线程在面试中基本上已经是必问项了,面试官通常会从简单的问题开始发问,然后再一步一步的挖掘你的知识面。
比如,从线程是什么开始,线程和进程的区别,创建线程有几种方式,线程有几种状态,等等。
接下来自然就会引出线程池,Lock,Synchronized,JUC的各种并发包。然后就会引出 AQS、CAS、JMM、JVM等偏底层原理,一环扣一环。
这一节我们不聊其他的,只说创建线程有几种方式。
是不是感觉非常简单,不就是那个啥啥那几种么。
其实不然,只有我们给面试官解释清楚了,并加上我们自己的理解,才能在面试中加分。
正文
一般来说我们比较常用的有以下四种方式,下面先介绍它们的使用方法。然后,再说面试中怎样回答面试官的问题比较合适。
1、继承 Thread 类
通过继承 Thread 类,并重写它的 run 方法,我们就可以创建一个线程。
- 首先定义一个类来继承 Thread 类,重写 run 方法。
- 然后创建这个子类对象,并调用 start 方法启动线程。
2、实现 Runnable 接口
通过实现 Runnable ,并实现 run 方法,也可以创建一个线程。
- 首先定义一个类实现 Runnable 接口,并实现 run 方法。
- 然后创建 Runnable 实现类对象,并把它作为 target 传入 Thread 的构造函数中
- 最后调用 start 方法启动线程。
3、实现 Callable 接口,并结合 Future 实现
- 首先定义一个 Callable 的实现类,并实现 call 方法。call 方法是带返回值的。
- 然后通过 FutureTask 的构造方法,把这个 Callable 实现类传进去。
- 把 FutureTask 作为 Thread 类的 target ,创建 Thread 线程对象。
- 通过 FutureTask 的 get 方法获取线程的执行结果。
4、通过线程池创建线程
此处用 JDK 自带的 Executors 来创建线