浅析java自定义线程池原理

  • 时间:
  • 9836人关注

这篇文章主要介绍了java自定义线程池的原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下,另外这篇文章主要知识点是关于java、线程池、Java的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子资料:

线程池的相关概念就不在这里说明了,百度一下有很多,这里简单表述一下如何实现一个自定义的线程池就行线程管理,我们如果要实现一个线程池对线程的管理,那么需要实现一下几点的思路:

1.如何管理线程

2.如何定义工作线程以及工作线程如何持续的保持运行状态

3.如何定义线程池大小及队列大小

4.如何提供接口给调用者使用

5.如何关闭线程池中的线程

接下来我们就一一的实现这几个问题。

1.我们需要定义一个队列来来管理线程,这里使用了LinkedBlockingQueue

// 1.定义一个存储线程队列 
private LinkedBlockingQueue<Runnable> queue; 

2.因为是一个简单的测试,所以我们可以先定义一个内部类来实现工作线程

// 2.定义工作线程进行线程的执行 
  class Worker extends Thread {  
    private SelfThreadPoolExecutor threadPoolExecutor; 
 
    public Worker(SelfThreadPoolExecutor poolExecutor) { 
      this.threadPoolExecutor = poolExecutor; 
    }  
    @Override 
    public void run() { 
      Runnable task; 
      while (threadPoolExecutor.receiveTask || threadPoolExecutor.queue.size() > 0) { 
        try { 
          // 有线程则取出来,否则等待 
          System.out.println("准备消费线程"); 
          task = threadPoolExecutor.queue.take(); 
          if (task != null) { 
            task.run(); 
            System.out.println("消费线程"); 
          } 
        } catch (InterruptedException e) { 
          e.printStackTrace(); 
        } 
      } 
    } 
  } 

SelfThreadPoolExecutor是外部定义的整体类名

3.使用有参的构造方法进行线程池大小的管理

// 3.存放工作线程的集合 
  private List<Worker> workerList;  
  // 4.线程池初始化 
  public SelfThreadPoolExecutor(int coreSize, int queueSize) { 
    if (coreSize <= 0 || queueSize <= 0) { 
      throw new IllegalArgumentException("参数不正确"); 
    } 
    this.queue = new LinkedBlockingQueue<>(queueSize); 
    // 线程安全的集合 
    this.workerList = Collections.synchronizedList(new ArrayList<>()); 
    for (int i = 0; i < coreSize; i++) { 
      Worker worker = new Worker(this); 
      worker.start(); 
      workerList.add(worker); 
    } 
  } 

4.定义阻塞和非阻塞的方式提供对应的接口

// 5.非阻塞的方法接口 
  public boolean offer(Runnable task) { 
    if (receiveTask) { 
      return queue.offer(task); 
    } else { 
      return false; 
    } 
  } 
  // 6.阻塞的方法接口 
  public void put(Runnable task) { 
    try { 
      if (receiveTask) { 
        queue.put(task); 
      } 
    } catch (InterruptedException e) { 
      e.printStackTrace(); 
    } 
  } 

6.进行线程池的关闭

// 7.线程池的关闭 
  private boolean receiveTask = true;  
  public void shutdown() { 
    // 7.1.队列不再接收线程 
    receiveTask = false; 
    // 7.2.关闭处于wait或block的线程 
    for (Thread thread : workerList) { 
      if (Thread.State.BLOCKED.equals(thread.getState()) 
      || Thread.State.WAITING.equals(thread.getState()) 
      || Thread.State.TIMED_WAITING.equals(thread.getState())){ 
        thread.interrupt(); 
      } 
    } 
  } 

我们测试的方法如下:

public static void main(String [] args){ 
    SelfThreadPoolExecutor selfThreadPoolExecutor = new SelfThreadPoolExecutor(5,10); 
    for(int i = 0;i < 20;i++){ 
      Runnable task = () ->{ 
        System.out.println("开启线程"); 
      }; 
      selfThreadPoolExecutor.put(task); 
    } 
    selfThreadPoolExecutor.shutdown(); 
  } 

运行结果是:

准备消费线程 
准备消费线程 
准备消费线程 
准备消费线程 
准备消费线程 
开启线程 
消费线程 
准备消费线程 
开启线程 
消费线程 
准备消费线程 
开启线程 
消费线程 
准备消费线程 
。。。。。。 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。


上一篇:浅析使用JavaCV实现获取视频每帧并保存

下一篇:Java单例模式和多例模式的知识点讲解

相关内容

  • 如何用Java实现将容器 Map中的内容保存到数组

    这篇文章主要介绍了Java实现将容器 Map中的内容保存到数组,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    05-03Java Map内容保存数组

    阅读更多
  • 如何让java程序运行

    04-29java程序运行

    阅读更多
  • java是如何输出的

    04-29java输出的方式

    阅读更多
  • java如何调用接口

    其实对于java调用接口进行获取对方服务器的数据在开发中特别常见,然而一些常用的基础的知识总是掌握不牢,让人容易忘记,写下来闲的时候看看,比回想总会好一些。 总体而言,一些东西知识点一直复制粘贴容易依赖,重要的是会忘记为什么这么写,只有理解到位,或者八九不离十才可以对于随时变化的情况进行分析,如果到家,还可以对别人或自己的进行优化。 如果你在这篇没有找到你想要的,请点击:java如何调用接口方式二 而对于一些知识

    04-27java调用接口的方法

    阅读更多
  • java如何定义数组

    Java中数组定义的三种方式 1.先声明 2.分配空间 3.赋值 public class arr{ public static void main(String[] args){ int[] arr; //先声明 arr=new int[5]; //分配空间 for(int i=0;i5;i++)arr[i]=i*10; //赋值 for(int i=0;i5;i++){ System.out.println(arr[+i+]=+arr[i]); } }} 结果: 方法二: 1.声明并分配空间 2.赋值

    04-27java定义数组方法

    阅读更多
  • Java 8基础应用与开发

    Java 8基础应用与开发

    《 Java8基础应用与开发 》包含Java8特点,知识结构图从入门到精通逐层加强,Q-DMS数据挖掘项目围绕本书,重视內容和实践活动,说道关键点和方式。结合实际成才全书的特性: 基础理论基础

    大小:188 MBJava8

    点击下载
  • 第三方JavaScript编程

    第三方JavaScript编程

    第三方JavaScript应用程序是自包含的应用组件,通常都是小脚本或插件,能够为Web站点增加功能。它们往往是由独立的组织或个人提供的,代码和文件都是来自于远程的Web地址。 《第三方JavaS

    大小:74.2 MBJavaScript

    点击下载
  • Java遗传算法编程

    Java遗传算法编程

    本书简单、直接地介绍了遗传算法,并且针对所讨论的示例问题,给出了Java代码的算法实现。全书共分为6章。本书适合机器学习爱好者阅读,尤其适合对遗传算法的理论和实现感兴趣的读者阅

    大小:28.8 MBJava算法

    点击下载
  • PHP、MySQL与JavaScript学习手册(第4版)

    PHP、MySQL与JavaScript学习手册(第4版)

    本书有借助面向对象的编程基础,深入学习PHP。研究MySQL,从数据库结构到复杂查询。掌握JavaScript语言,以及带有jQuery的增强功能。调用Ajax进行后台浏览器/服务器通信等,欢迎免费下载

    大小:76 MBPHP

    点击下载
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)

    深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)

    大小:253 MBJava虚拟机

    点击下载
  • 疯狂Java讲义精粹(第2版)

    疯狂Java讲义精粹(第2版)

    本书以疯狂Java讲义(第2版)为蓝本,覆盖Java 8全新特性,大部分示例程序都采用Lambda表达式、流式API进行了改写,海量面试题及答案,数百个书中实例及详实课件,适合各种层次的Java学习者和

    大小:120.2 MBJava

    点击下载
  • 学习JavaScript数据结构与算法(第3版)

    学习JavaScript数据结构与算法(第3版)

    大小:13.6 MBJavaScript

    点击下载
  • 自己动手写Java虚拟机

    自己动手写Java虚拟机

    Java虚拟机非常复杂,要想真正理解它的工作原理,最好的方式就是自己动手编写一个! 本书是继《深入理解Java虚拟机》之后的又一经典著作,它一方面遵循《Java虚拟机规范》,一方面又独辟

    大小:4.27 MBJava

    点击下载
  • 菜鸟成长之路:Java程序员职场全攻略

    菜鸟成长之路:Java程序员职场全攻略

    《菜鸟成长之路:Java程序员职场全攻略》 内容简介:以包罗万象的IT这个大江湖为背景,将Java职场中从入门前的学校菜鸟到成长为技术大牛的过程展现给读者,内容饱满但又不失趣味性。在《

    大小:51.4 MBJava职场

    点击下载

学习笔记