服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java实现手写线程池实例并测试详解

Java实现手写线程池实例并测试详解

2023-03-04 15:41小威要向诸佬学习呀 Java教程

这篇文章主要来模拟一下线程池和工作队列的流程,以及编写代码和测试类进行测试。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下

前言

在之前的文章中介绍过线程池的核心原理,在一次面试中面试官让手写线程池,这块知识忘记的差不多了,因此本篇文章做一个回顾。

希望能够加深自己的印象以及帮助到其他的小伙伴儿们

在线程池核心原理篇介绍过线程池的核心原理,今天来模拟线程池和工作队列的流程,以及编写代码和测试类进行测试。下面附下之前线程池的核心流程:

Java实现手写线程池实例并测试详解

在线程池核心原理的源码中,涉及到了一系列的流程,包括线程池队列数量是否已满,运用什么样的拒绝策略等。在我们手写线程池的代码中,不需要考虑那么多因素,只需要模拟简单的情景和过程,因此整体来讲还是比较简单的。

手写线程池,必不可少的组件有任务队列,任务的消费者线程池,线程池创建等。我们也可定义构造方法,创建指定大小的线程池线程个数。当然在使用完线程池中的线程后,我们需要考虑将其销毁或关闭。

Java实现手写线程池实例并测试详解

相关代码和解释如下:

package XIAOWEI;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.stream.IntStream;

public class ThreadPool {
  private static final int WorkQueueSIZE = 5;
  private BlockingQueue<Runnable> workQueue;
  private List<WorkThread> workThreads=new ArrayList<WorkThread>();

  /**
   * @author xiaowei
   * @param poolSize
   * @param workQueue
   * 构造方法,传线程池的大小和阻塞队列
   */
  public ThreadPool(int poolSize,BlockingQueue<Runnable> workQueue) {
      this.workQueue = workQueue;
      IntStream.range(0,poolSize).forEach((i)->{
          WorkThread workThread=new WorkThread();
          workThread.start();
          workThreads.add(workThread);
      });
  }

  /**
   * @param poolSize
   * 在ThreadPool的构造方法中传入线程池的大小
   */
  public ThreadPool(int poolSize){
      this(poolSize,new LinkedBlockingQueue<>(WorkQueueSIZE));
  }

  /**
   * @param task
   * 通过线程池执行任务
   */
  public void extcute(Runnable task){
      try {
          workQueue.put(task);
      } catch (InterruptedException e) {
          e.printStackTrace();
      }
  }
  public void shutdown(){
      if(workThreads!=null && workThreads.size()>0){
          workThreads.stream().forEach((workThread) -> {
              workThread.interrupt();
          });
      }
  }
  /**
   * 内部类 源源不断的消耗workQueue中的任务
   */
  class WorkThread extends Thread {
      @Override
      public void run() {
          Thread currentThread = Thread.currentThread();
          // 死循环 不断一直消费队列中的任务 直到任务被消费完全
          while (true) {
              try {
                  if (currentThread.isInterrupted()) {
                      break;
                  }
                  Runnable workTasK = workQueue.take();
                  workTasK.run();
              } catch (InterruptedException e) {
                  currentThread.interrupt();
              }
          }
      }
  }
}

相关测试代码如下:

package XIAOWEI;

import java.util.stream.IntStream;

public class ThreadPoolTest {
  public static void main(String[] args) {
      ThreadPool threadPool = new ThreadPool(5);
      IntStream.range(0,10).forEach((i)->{
          threadPool.extcute(()->{
              System.out.println(Thread.currentThread().getName()+"2023一起加油");
          });
      });
      threadPool.shutdown();
  }
}

一共在线程池中加入了五个线程和十个任务,因此每个线程会执行两个任务。

测试结果如下图所示:

Java实现手写线程池实例并测试详解

以上就是Java实现手写线程池实例并测试详解的详细内容,更多关于Java手写线程池的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/qq_53847859/article/details/129113884

延伸 · 阅读

精彩推荐
  • Java教程log4j使用详细解析

    log4j使用详细解析

    Log4j 除了可以记录程序运行日志信息外还有一重要的功能就是用来显示调试信息。下面通过本文给大家介绍log4j使用详细解析,感兴趣的朋友一起看看吧...

    动力节点14252021-01-22
  • Java教程深入理解java中的拷贝机制

    深入理解java中的拷贝机制

    这篇文章主要给大家深入介绍了java中的拷贝机制,网上关于java中拷贝的文章也很多,但觉得有必要再深的介绍下java的拷贝机制,有需要的朋友可以参考学...

    QuinnNorris4112020-08-12
  • Java教程java 中二分法查找的应用实例

    java 中二分法查找的应用实例

    这篇文章主要介绍了java 中二分法查找的应用实例的相关资料,希望通过本文大家能掌握二分法的使用方法,需要的朋友可以参考下...

    lfdfhl3922020-12-28
  • Java教程10个Java程序员熟悉的面向对象设计原则

    10个Java程序员熟悉的面向对象设计原则

    这篇文章主要为大家详细介绍了Java程序员应当知道的10个面向对象设计原则,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    qq_379049093922020-08-31
  • Java教程Java方法重写_动力节点Java学院整理

    Java方法重写_动力节点Java学院整理

    在Java和其他一些高级面向对象的编程语言中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而...

    动力节点1922020-09-12
  • Java教程一起来了解Java的File类和IO流

    一起来了解Java的File类和IO流

    这篇文章主要为大家详细介绍了Java File类和IO流,在Java学习中,file类与io流是非常重要的部分,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助...

    静静子♡3872022-09-21
  • Java教程详解Java如何简化条件表达式

    详解Java如何简化条件表达式

    在复杂的实际业务中,往往会出现各种嵌套的条件判断逻辑。随着需求的增加,条件逻辑会变得越来越复杂。面对这种情况,简化判断逻辑就是不得不做的...

    谢天_bytedance11012023-02-22
  • Java教程Java基于Lock的生产者消费者模型示例

    Java基于Lock的生产者消费者模型示例

    这篇文章主要介绍了Java基于Lock的生产者消费者模型,结合实例形式分析了java基于锁机制的生产者消费者模型相关实现与使用技巧,需要的朋友可以参考下...

    u0130631536062021-05-27