多线程和线程池常见面试题(面试总结)

一、进程与线程:
1.1进程就是正在执行的程序,线程是程序执行的一条路径,一个进程之中可以包含多个线程。通俗的讲,我们可以把打开微信开做一个进程,在微信里和一个好友进行视频聊天就是开启了一个线程。
1.2一个进程里可以有多条线程,至少有一条线程,我认为可以理解为当你开启进程时默认开启一条线程,一条线程一定会在一条进程里,就好像你不打开微信就没有办法和微信里的好友进行聊天。
二、创建线程的三种方式:
1 继承Thread类
 定义一个类MyThread继承Thread类,并重写run方法。
 将要执行的代码写在run方法中。
 创建该类的实例,并调用start()方法开启线程

2实现Runnable接口
 定义一个类MyRunnable接口,并重写run方法。
 将要执行的代码写在run方法中
 创建Thread对象,传入MyRunnable的实例,并调用start()方法开启线程

3 实现Callable接口
Callable是类似于Runnnable的接口,实现Callable接口的类和实现Runnable的类都是
可被其他线程执行的任务
 自定义一个类MyCallable实现Callable接口,并重写call()方法
 将要执行的代码写在call()方法里
 创建线程池对象,调用submit()方法执行MyCallable任务,并返回Future对象
 调用Future对象的get()方法获取call()方法执行完后的值

1.1继承Thread类与实现Runnable接口的区别
我们都知道java支持单继承,多实现。实现Runnabel接口还可以继承其他类,而使用继承Threa就不能继承其他类所以当你想创建一个线程又希望继承其他类的时候就该选择实现Runnable接口的方式。也就是说当你实现了Thread接口之后这个类只能作为Thread接口的实现类不能再继承其他的类,这个类中只能存在Thread接口的方法实现。
1.2Runable与Callable接口的区别
一个进程代表一个应用程序。不同的进程之间不能共享代码和数据,一个进程包含若干个线程,同时创建多个线程来完成某项任务,便是多线程,实现线程的方式有继承Thread类,实现Runable接口,实现Callable接口.Runable和Callable的区别是Callable执行的方法是call(),Call()方法有返回值还能抛出异常,而Runnable执行的方法是run(),run()方法没有返回值,也不能抛出异常。

为什么要使用线程池
为了减少创建和销毁线程的次数,让每个线程可以多次使用,可根据系统情况调整执行的线程数量,防止消耗过多内存,我们可以使用线程池.
java中线程池的顶级接口是Executor,ExecutorService是Executor的子类,也是真正的线程池接口,它提供了提交任务和关闭线程池等方法。调用submit方法提交任务还可以返回一个Future对象,利用该对象可以了解任务执行情况,获得任务的执行结果或取消任务。
由于线程池的配置比较复杂,JavaSE中定义了Executors类就是用来方便创建各种常用线程池的工具类。通过调用该工具类中的方法我们可以创建单线程池(newSingleThreadExecutor),固定数量的线程池(newFixedThreadPool),可缓存线程池(newCachedThreadPool),大小无限制的线程池(newScheduledThreadPool),比较常用的是固定数量的线程池和可缓存的线程池,固定数量的线程池是每提交一个任务就是一个线程,直到达到线程池的最大数量,然后后面进入等待队列直到前面的任务完成才继续执行.可缓存线程池是当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又智能的添加新线程来执行.
Executors类中还定义了几个线程池重要的参数,比如说int corePoolSize核心池的大小,也就是线程池中会维持不被释放的线程数量.int maximumPoolSize线程池的最大线程数,代表这线程池汇总能创建多少线程。corePoolSize :核心线程数,如果运行的线程数少corePoolSize,当有新的任务过来时会创建新的线程来执行这个任务,即使线程池中有其他的空闲的线程。maximumPoolSize:线程池中允许的最大线程数.

创建四种线程池
一.可缓存线程池CachedThreadPool()
1.这种线程池内部没有核心线程,线程的数量是有没限制的。
2.在创建任务时,若有空闲的线程时则复用空闲的线程,若没有则新建线程。
3.没有工作的线程(闲置状态)在超过了60S还不做事,就会销毁。
二.FixedThreadPool 定长线程池
1.该线程池的最大线程数等于核心线程数,所以在默认情况下,该线程池的线程不会因为闲置状态超时而被销毁。
2.如果当前线程数小于核心线程数,并且也有闲置线程的时候提交了任务,这时也不会去复用之前的闲置线程,会创建新的线程去执行任务。如果当前执行任务数大于了核心线程数,大于的部分就会进入队列等待。等着有闲置的线程来执行这个任务。
三.SingleThreadPool
1.有且仅有一个工作线程执行任务
2.所有任务按照指定顺序执行,即遵循队列的入队出队规则
四.ScheduledThreadPool
1.不仅设置了核心线程数,最大线程数也是Integer.MAX_VALUE。
2.这个线程池是上述4个中为唯一个有延迟执行和周期执行任务的线程池。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猫A建仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值