• 线程池简介说明


    转自:

    http://www.java265.com/JavaCourse/202110/1494.html

    下文是笔者讲述线程池的相关简介说明,如下所示:

    线程池的简介

    线程池(Thread Pool):用于规定应用程序中同一时刻可运行的线程数,用于管理程序中的线程数
    通常我们将并发执行的任务传递给一个线程池,让线程池启动新的线程,此时只有当线程池中存在空闲线程时,线程池才会分配一个线程运行
    线程池内部任务将被插入一个阻塞队列中,当一个新任务插入到队列中时,一个空闲线程会从队列中取出任务,并运行它

    线程池应用场景

    线程池常应用在多线程服务器上
    每个通过网络到达服务器的连接都被包装成一个任务并且传递给线程池
    线程池的线程会并发的处理连接上的请求

    例:
    实现一个简单的线程池

    public class ThreadPool {
      private BlockingQueue taskQueue = null;
      private List threads = new ArrayList();
      private boolean isStopped = false;
      public ThreadPool(int noOfThreads, int maxNoOfTasks) {
        taskQueue = new BlockingQueue(maxNoOfTasks);
    
        for (int i=0; i taskQueue = null;
      private boolean       isStopped = false;
    
      public PoolThread(BlockingQueue queue) {
        taskQueue = queue;
      }
      public void run() {
        while (!isStopped()) {
          try {
            Runnable runnable =taskQueue.take();
            runnable.run();
          } catch(Exception e) {
            // 写日志或者报告异常,
            // 但保持线程池运行.
          }
        }
      }
     
      public synchronized void toStop() {
        isStopped = true;
        this.interrupt(); // 打断池中线程的 dequeue() 调用
      }
    
      public synchronized boolean isStopped() {
        return isStopped;
      }
    }
    
    线程池的实现由两部分组成:
     类ThreadPool是线程池的公开接口,
     而类PoolThread用来实现执行任务的子线程
    
    为了执行一个任务,方法ThreadPool.execute(Runnable r)用 Runnable 的实现作为调用参数
    在内部,Runnable 对象被放入阻塞队列 (Blocking Queue),等待着被子线程取出队列。
    
    一个空闲的PoolThread线程会把Runnable对象从队列中取出并执行
    你可以在 PoolThread.run() 方法里看到这些代码
    执行完毕后PoolThread进入循环并且尝试从队列中再取出一个任务,直到线程终止。
    
    调用 ThreadPool.stop() 方法可以停止ThreadPool
    在内部,调用 stop 先会标记 isStopped 成员变量(为 true)
    然后,线程池的每一个子线程都调用 PoolThread.stop()方法停止运行
    ------------------------------------------------------------------
    注意事项:
     当线程池execute()在stop()之后调用execute()方法会抛出IllegalStateException异常
    
    子线程会在完成当前执行的任务后停止
    注意PoolThread.stop()方法中调用this.interrupt()
    它确保阻塞在 taskQueue.dequeue()里wait()调用的线程能够跳出 wait()调用
    并且抛出一个 InterruptedException 异常离开 dequeue() 方法。这个异常在 PoolThread.run() 方法中被截获、报告
    然后再检查 isStopped 变量。由于 isStopped 的值是 true, 因此 PoolThread.run() 方法退出,子线程终止
  • 相关阅读:
    获取(复制)网页上的文字
    一个小台灯
    简述React 和 Vue 的 diff 时间复杂度从 O(n^3) 优化 到 O(n) ,那么 O(n^3) 和 O(n) 是如何计算出来的 ?
    举个栗子~Tableau 技巧(238):可灵活对比的雷达图(Radar Chart)
    Redis
    线程池简单介绍
    2023年腾讯云2核4G配置服务器性价比怎么样?
    数据结构与算法(Java版) | 几个经典的算法面试题(上)
    Qt图像处理技术十二:QImage实现边缘检测(sobel算法)
    数码好物推荐,双十一好物选购攻略
  • 原文地址:https://blog.csdn.net/qq_25073223/article/details/126605427