多线程、线程池篇

雨点打透心脏的1/2处 2024-03-26 11:13 173阅读 0赞

一、初始化线程的四种方式

1.继承Thread

2.实现Runable接口

3.实现Callable接口+FutureTask(可以拿到返回结果,可以处理异常)

方式1和方式2:主进程无法获取线程的运算结果,不合适当前场景。

方式3:主进程可以获取线程的运算结果,但是不利于服务器种的线程资源,会导致服务器资源耗尽

方式4:正常开发通过线程池的方式初始化线程,因为通过线程池性能稳定,也可以获取执行结果,并捕获异常。

  1. Executors.newFiexedThreadPool(3);
  2. //或者
  3. new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit unit, workQueue, threadFactory,

二、线程池的七大参数

1、核心线程数:线程池中一直保持的可运行的核心线程

2、最大线程数:线程池中允许的最大线程数。

3.空闲线程时间:当线程池中的线程数量超过核心线程数,且这些线程空闲时间超过空闲线程时间,多余的线程就会销毁,直到线程池中的线程数量不大于核心线程数。

4.时间单位:线程的时间单位

5.阻塞队列:用来存储等待执行的任务线程,如果当前对线程的需求超过了核心线程数大小,就会放在这里等待空闲线程执行。

6.工厂:创建线程的工厂

7.拒绝策略:当队列满,且线程达到最大线程后,还有任务进来,线程池就会使用拒绝策略。

三、线程池的运行流程:

例子:一个线程池 核心线程数10个,最大线程数20个,阻塞队列50个、共100个并发任务进来如何分配:

10个核心线程直接执行,然后50个任务进入阻塞队列,因为最大线程是20,最大线程-核心线程=10个线程,还可以安排10个线程,最大可以安排70个线程执行(阻塞队列数+最大线程数),剩余30个任务进入拒绝策略处理,不执行。

3fd01de819eb4b95ab7e9ae17a6089a8.png

  1. import java.util.concurrent.*;
  2. public class ThreadPoolExample {
  3. public static void main(String[] args) {
  4. // 创建一个线程池,core 10:max20,queue:50
  5. ThreadPoolExecutor executor = new ThreadPoolExecutor(
  6. 10, // 核心线程数为 10
  7. 20, // 最大线程数为 20
  8. 0L, TimeUnit.MILLISECONDS, // keep-alive time 为 0 毫秒,即非核心线程空闲立即回收
  9. new LinkedBlockingQueue<>(50)); // 阻塞队列大小为 50
  10. // 设置拒绝策略为抛出异常
  11. executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
  12. try {
  13. // 开始提交 100 个任务
  14. for (int i = 0; i < 100; i++) {
  15. executor.execute(() -> {
  16. try {
  17. Thread.sleep(100);
  18. System.out.println("Task executed by thread " + Thread.currentThread().getId());
  19. } catch (InterruptedException e) {
  20. e.printStackTrace();
  21. }
  22. });
  23. }
  24. } finally {
  25. // 关闭线程池
  26. executor.shutdown();
  27. }
  28. }
  29. }

三、开发中为什么要使用线程池?

1、降低资源的消耗:

通过复用线程池中创建好的线程,降低线程重复创建和销毁造成的损耗。

2、提高响应速度:

因为线程池中的线程数没有超过线程池的最大上限时,有点线程处于等待分配任务的状态,当任务来的时候无需创建新的线程就可以复用执行

3、提高线程的可管理性

线程池会根据当前系统特点对池内的线程进行优化处理,减少创建和销毁线程带来
的系统开销,无限的创建和销毁线程不仅消耗系统资源,还降低系统的稳定性,使
用线程池可以进行线程统一分配。

四、常用的线程池有哪些?

1、定时任务线程池(ScheduledThreadPool):该线程池主要用于周期性的任务,它可以按照指定的时间间隔,或者指定的时间执行任务,可以通过AOP+@Log用来异步执行操作日志插入等操作。

2、单例线程池(SingleThreadExecutor):该线程池中只有一个线程,用于顺序执行线程任务

3、自定义线程池(ThreadPoolExecutor):在编程中,使用线程池的概念创建一个能够重复利用线程的对象池。自定义线程池可以控制同时运行线程数量,以达到最优的性能和资源利用率

发表评论

表情:
评论列表 (有 0 条评论,173人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java线-线

    线程池-基本原理 概述 : ​ 提到池,大家应该能想到的就是水池。水池就是一个容器,在该容器中存储了很多的水。那么什么是线程池呢?线程池也是可以看做成一个池子,在该池子