线程池

阻塞队列

结构:

Collection 接口
	|
Queue 接口
	|
BlockingQueue接口
	|
实现类
ArrayBlockingQueue  底层数组,创建时需指定大小,无界。
LinkedBlockingQueue  底层链表,默认长度21亿。
SynchronousQueue  不存储元素,而是直接将生产出的元素丢给消费者。

阻塞队列常用API:

抛出异常特殊值阻塞超时
插入add(e)offer(e)put(e)offer(e, time,unit)
移除remove()poll()take()poll(time,unit)
检查element()peek()//

线程池

核心类:
Executor 接口 
	|
ExecutorService接口
	|
实现类ThreadPoolExecutor
常见线程池:
  • newFixedThreadPool:

    Executors.newFixedThreadPool(5)
    

    创建一个固定长度的线程池,每当提交一个任务就创建一个线程,直到达到线程池的最大数量,这时线程规模将不再变化,然后执行完线程池再把这个线程回收,当线程发生未预期的错误而结束时,线程池会补充一个新的线程。

  • newSingleThreadExecutor:

        Executors.newSingleThreadExecutor()
    

    这是一个单线程的Executor,它创建单个工作线程来执行任务,如果这个线程异常结束,会创建一个新的来替代它;它的特点是能确保依照任务在队列中的顺序来串行执行

  • newCachedThreadPool:

    Executors.newCachedThreadPool
    

    创建一个可缓存的线程池,如果线程池的规模超过了处理需求,将自动回收空闲线程,而当需求增加时,则可以自动添加新线程,线程池的规模不存在任何限制。

  • newScheduledThreadPool(int corePoolSize)(了解)

    创建了一个固定长度的线程池,而且以延迟或定时的方式来执行任务,类似于Timer。

示范代码:

public class ThreadPoolDemo {
  public static void main(String[] args) throws InterruptedException {
    // 指定线程数
    ExecutorService threadPool = Executors.newFixedThreadPool(5);
    // 只有一个
    ExecutorService threadPool2 = Executors.newSingleThreadExecutor();
    // 自己能忙过来就自己干,忙不过来就请帮手
    ExecutorService threadPool3 = Executors.newCachedThreadPool();
    for (int i = 0; i < 10; i++) {
      threadPool3.execute(new Runnable() {
        @Override
        public void run() {
          System.out.println(Thread.currentThread().getName()+"正在执行任务");
        }
      });
      Thread.sleep(500);
    }
  }
}
线程池 重要参数:

这三个线程池,

  1. 底层都是用的ThreadPoolExecutor
  2. 并且都是7个参数
  3. 并且调动方法都一样
  4. 使用的LinkedBlockingQueue 底层链表,默认长度21亿
线程池的7个参数包括:
  1. int corePoolSize

  2. int maxiumPoolSize

  3. long keepAliveTime

  4. TimeUnit unit

  5. BlockingQueue workQueue

  6. ThreadFactory threadFactory

  7. RejectedExecutionHandler handler

  • corePoolSize:线程池核心池大小,也就是常驻的核心线程数

  • maxiumPoolSize:最大池大小,也就是最大线程数

  • keepAliveTime:多于的空闲线程的存活时间,当前线程池数量超过corePoolSize时,当高峰期过去,空闲时间达到keepAliveTime还没线程需要处理任务.,多余空闲线程会被销毁,相当于从maxiumPoolSize缩容回corePoolSize,减少资源消耗

  • unit:keepAliveTime的单位

  • workQueue:放任务的,候客区,用于排队等候队列。

  • threadFactory:默认工厂

  • RejectedExecutionHandler:拒绝策略

RejectedExecutionHandler 的四种拒绝策略:
  1. AbortPolicy(默认):直接抛出RejectedExecutionException异常,组织系统正常运行。
  2. CallerRunsPolicy:调用者运行一种调用机制,该策略不会抛出异常,而是将某些任务退回给调用者,从而降低流量。
  3. DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加入到队列中再尝试提交任务。
  4. DiscardPolicy:直接丢弃任务,不予处理,如果允许任务丢失,这是最好的解决方案。
线程池都有哪些状态?

线程池有5种状态:Running、ShutDown、Stop、Tidying、Terminated。

线程池各个状态切换框架图:

在这里插入图片描述

线程池中 submit()和 execute()方法有什么区别?
  • 接收的参数不一样
  • submit有返回值,而execute没有
  • submit方便Exception处理
工作的线程的数量是怎么算的?经验
  1. CPU型 这些多线程程序在进行大量的运算 线程数=CPU核数+1
  2. IO型 没有大量的计算 CPU的2倍或3倍

示例代码:

public class ThreadPoolDemo {
  public static void main(String[] args) throws InterruptedException {
    // 指定线程数
    ExecutorService threadPool = Executors.newFixedThreadPool(5);
    // 只有一个
    ExecutorService threadPool2 = Executors.newSingleThreadExecutor();
    // 自己能忙过来就自己干,忙不过来就请帮手
    ExecutorService threadPool3 = Executors.newCachedThreadPool();

    // 工作中自定义线程池
    ExecutorService threadPoolExecutor = new ThreadPoolExecutor(2,4,1L,
                                                                TimeUnit.MILLISECONDS,new LinkedBlockingDeque<>(3),
                                                                Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());
    for (int i = 0; i < 7; i++) {
      threadPoolExecutor.execute(new Runnable() {
        @Override
        public void run() {
          System.out.println(Thread.currentThread().getName()+"正在执行任务");
        }
      });
    }
  }
}

手写线程池(了解)

线程池是Executors,底层是LinkedBlockingQueue,而LinkedBlockingQueue的底层是一个链表,大小是21亿

public class FixedThreadPool {

  // 阻塞队列
  private BlockingQueue<Runnable> taskQueue;
  // 集合
  private List<Worker> works;

  public FixedThreadPool(int poolSize,int taskNum){
    taskQueue = new LinkedBlockingDeque<>(taskNum);
    works = new ArrayList<>();

    for (int i = 0; i < poolSize; i++) {
      Worker w = new Worker(this);
      w.start();
      works.add(w);
    }
  }

  public boolean execute(Runnable r){
    return taskQueue.offer(r);
  }

  private static class Worker extends Thread{

    FixedThreadPool pool = null;
    public Worker(FixedThreadPool pool){
      this.pool = pool;
    }

    public void run(){
      while(true){
        Runnable task = null;
        try {
          task = pool.taskQueue.take();
          if(task!=null){
            task.run();
          }
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
    }
  }
}

public class ThreadPoolDemo {
  public static void main(String[] args) {

    // 自己手写线程池
    FixedThreadPool threadPool4 = new FixedThreadPool(5,8);
    for (int i = 0; i < 10; i++) {
      threadPool4.execute(new Runnable() {
        @Override
        public void run() {
          System.out.println(Thread.currentThread().getName()+"正在执行任务");
        }
      });
    }
  }
}

线程池执行任务,调用execute方法,任务提交到阻塞队列中,taskQueue.offer(r)提交之前new了poolSize,准备好线程数,w.start();准备好了5个线程,这些线程进入run方法的while循环中,从阻塞队列里拿task,拿出来的就是提交的task。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值