JAVA基础问题,面试题(6)

29.为什么使用线程池,以及其参数解释?

使用线程池好处:

  1. 降低资源消耗提高线程利用率,降低创建和销毁线程消耗。
  2. 提高响应速度;任务来了,直接有线程可用执行,而不是先创建线程在执行。
  3. 提高线程的可管理性;线程是稀缺资源,使用线程池可以统一分配调优监控。

参数:

corePoolSize:代表核心线程数,也就是正常情况下创建工作的线程数,这些线程创建后并不会消除,而是一种常驻线程。

maxinumPoolSize:代表最大线程数,它与核心线程数相对应,表示最大允许被创建的线程数,比如当前任务较多,将核心线程数都用完,还无法满足需求时候,此时会创建新的线程,但是线程池内线程总数不会超过最大线程数。

KeepAliveTimeunit:表示超出核心线程数外的空闲存活时间,也就是核心线程不会 被消除,但是超出核心线程数的部分线程如果空闲一定时间则一定会被消除

workQueue:用于存放待执行的任务,假设我们现在核心线程都被使用,还有任务进入队列,直到整个队列被放满但是任务还在继续执行时候,会开始创建新的线程。

ThreadFactory:实际是一个线程工厂,用于生产线程执行任务。

Handler:认为拒绝策略,有两种情况,第一种是当我们使用shutdown等方法关闭线程池后,这时候即使线程池内部还有没执行完毕任务,但是由于线程池关闭,再想向线程池提交任务会被拒绝另一种情况是达到最大线程数,拒绝

30.简述线程池处理流程

31.线程池中使用阻塞队列作用?为什么是先添加队列而不是先创建最大线程?

1.一般队列只能保证作为一个有限长度的缓冲区,如果超出缓冲长度,就无法保留当前任务,阻塞队列通过阻塞可以保留住当时想要继续入队的任务。

阻塞队列可以保证任务队列中没有任务时候阻塞获取任务的线程,使得线程进入wait状态,释放cpu资源。(有阻塞队列技术可以使得当前无任务执行的线程自动进入阻塞状态,而不需要程序员手动调用wait或者sleep等控制线程休眠

阻塞队列自带阻塞和唤醒功能,不需要额外处理,无任务执行时候,线程池利用阻塞队列的take方法挂起,从而维持核心线程存活,不至于一直占用cpu资源。

2. 为什么是先添加队列而不是先创建最大线程?

(1)避免线程数量过多。如果直接创建最大线程数的线程,那么在高并发情况下,很容易出现线程数量过多的情况,这会导致系统的性能下降,甚至会引起系统崩溃。通过采用阻塞队列的方式,可以限制线程的数量,避免出现线程数量过多的情况。

(2)提高程序的稳定性。由于线程的创建和销毁是需要消耗系统资源的,如果频繁地创建和销毁线程,会导致系统资源的浪费,进而降低程序的稳定性。采用线程池可以复用线程,避免频繁地创建和销毁线程,提高程序的稳定性。

(3)提高任务处理的效率。如果直接创建最大线程数的线程,那么在处理任务较少的情况下,很多线程会处于空闲状态,这会导致系统资源的浪费。而采用阻塞队列的方式,可以让线程池中的线程在处理完任务后,继续等待新的任务,提高任务处理的效率。

32.线程池中线程复用原理

线程池中线程复用的原理是通过维护一定数量的核心线程和一个任务队列来实现的。当一个任务提交给线程池时,线程池会按照以下步骤来处理:

1. 如果核心线程池中有空闲线程,则将任务分配给空闲线程执行。

2. 如果核心线程池中的线程都在执行任务,并且任务队列没有达到最大容量,线程池会将任务放入任务队列中等待执行。

3. 如果任务队列已满,但线程池的总线程数没有达到最大线程数(maximumPoolSize),线程池会创建新的线程来执行任务。

4. 如果线程池的总线程数已经达到最大线程数,线程池会根据拒绝策略(RejectedExecutionHandler)来处理无法执行的任务,例如抛出异常、丢弃任务等。

当一个线程执行完任务后,并不会立即销毁,而是会继续保持在线程池中,等待下一个任务的到来。这样通过复用线程,可以减少线程的创建和销毁开销,提高线程的利用率和系统的性能。

线程池将线程和任务进⾏解耦,线程是线程,任务是任务,摆脱了之前通过 Thread 创建线程时的⼀个线程必须对应⼀个任务的限制。

在线程池中,同⼀个线程可以从阻塞队列中不断获取新任务来执⾏,其核⼼原理在于线程池对Thread进⾏了封装,并不是每次执⾏任务都会调⽤ Thread.start()来创建新线程,⽽是让每个线程去执⾏⼀个“循环任务”在这个“循环任务”中不停检查是否有任务需要被执⾏,如果有则直接执⾏,也就是调⽤任务中的 run ⽅法,将 run ⽅法当成⼀个普通的⽅法执⾏,通过这种⽅式只使⽤固定的线程就将所有任务的 run ⽅法串联起来。

在线程复用的过程中,需要注意以下几点:

1. 避免线程泄漏:确保线程执行完任务后能够正确释放资源,防止线程泄漏导致内存泄漏问题。

2. 确保线程安全:多个线程同时操作共享资源时,需要考虑线程安全性,避免出现竞态条件、死锁等问题。

3. 控制线程数量:合理设置核心线程数、最大线程数和任务队列容量,避免因线程数量过多导致系统资源耗尽。

总的来说,线程池通过线程复用的原理,可以提高系统的性能和资源利用率,同时避免不必要的线程创建和销毁开销。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值