当前位置: 首页 > article >正文

面试高频知识点:2线程 2.1.5如何自定义实现一个线程池

在Java中,线程池是一种用于管理线程的机制,它可以有效地管理多个线程并且可以重复使用它们,从而减少了线程创建和销毁的开销,提高了线程的利用率。本文将介绍如何自定义实现一个简单的线程池,并提供相应的Java代码示例。

线程池的基本原理

自定义一个简单的线程池需要考虑以下几个关键组件:

  1. 任务队列(Task Queue):用于存储待执行的任务。

  2. 线程池管理器(ThreadPool Manager):负责管理线程池,包括创建、销毁线程等操作。

  3. 工作线程(Worker Thread):实际执行任务的线程。

基本的工作流程如下:

  1. 当有任务需要执行时,将任务添加到任务队列中。

  2. 线程池管理器不断从任务队列中取出任务,并分配给空闲的工作线程执行。

  3. 执行完任务的工作线程将结果返回,并继续等待下一个任务。

  4. 当任务队列为空且没有新的任务添加时,线程池管理器会关闭线程池。

实现一个简单的线程池

下面是一个简单的Java实现:

import java.util.LinkedList;
import java.util.List;

public class CustomThreadPool {
    private final int maxThreads;
    private final List<WorkerThread> threads;
    private final LinkedList<Runnable> taskQueue;

    public CustomThreadPool(int maxThreads) {
        this.maxThreads = maxThreads;
        threads = new LinkedList<>();
        taskQueue = new LinkedList<>();

        for (int i = 0; i < maxThreads; i++) {
            WorkerThread worker = new WorkerThread();
            threads.add(worker);
            worker.start();
        }
    }

    public synchronized void submit(Runnable task) {
        taskQueue.add(task);
        notify();
    }

    public synchronized void shutdown() {
        for (WorkerThread worker : threads) {
            worker.stopThread();
        }
    }

    private class WorkerThread extends Thread {
        private boolean running = true;

        @Override
        public void run() {
            while (running) {
                Runnable task;
                synchronized (CustomThreadPool.this) {
                    while (taskQueue.isEmpty()) {
                        try {
                            CustomThreadPool.this.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    task = taskQueue.poll();
                }
                try {
                    task.run();
                } catch (RuntimeException e) {
                    e.printStackTrace();
                }
            }
        }

        public void stopThread() {
            running = false;
        }
    }
}

// 示例任务
class ExampleTask implements Runnable {
    private final int taskId;

    public ExampleTask(int taskId) {
        this.taskId = taskId;
    }

    @Override
    public void run() {
        System.out.println("Task " + taskId + " is being executed by Thread: " + Thread.currentThread().getName());
    }
}

// 示例用法
class Main {
    public static void main(String[] args) {
        CustomThreadPool threadPool = new CustomThreadPool(3);

        for (int i = 1; i <= 5; i++) {
            Runnable task = new ExampleTask(i);
            threadPool.submit(task);
        }

        threadPool.shutdown();
    }
}

示例解析

  • CustomThreadPool 类实现了一个简单的线程池,其中包含了最大线程数、工作线程列表和任务队列等成员变量。

  • submit 方法用于向线程池提交任务,并唤醒等待中的工作线程。

  • shutdown 方法用于关闭线程池,通过停止所有工作线程的运行来实现。

  • WorkerThread 类继承自 Thread,表示线程池中的工作线程,其 run 方法循环执行任务队列中的任务。

  • ExampleTask 类是一个示例任务,其中包含了任务的具体执行逻辑。

  • 在示例中,通过创建线程池并提交任务,可以看到任务在多个工作线程间被并发执行。


http://www.kler.cn/a/232176.html

相关文章:

  • Javascript_设计模式(二)
  • K8S 查看pod节点的磁盘和内存使用情况
  • Git如何简单使用
  • 服务器被挂马怎么办?——解决服务器被挂马的方法和步骤
  • 【网络安全 | 甲方建设】双/多因素认证、TOTP原理及实现
  • Flutter:input输入框
  • C语言--------指针(1)
  • muduo库的模拟实现——TcpServer部分
  • 运维高级篇-分库分表(拆分策略详解)
  • 假期作业 7
  • 【嵌入式-传感器】从旋转编码器到学会看懂方波
  • 《动手学深度学习(PyTorch版)》笔记7.6
  • 复制和粘贴文本时剥离格式的5种方法(MacWindows)
  • c# Config 配置文件帮助类
  • 3.2 Verilog 时延
  • 一个基于 .NET 7 + Vue.js 的前后端分离的通用后台管理系统框架 - DncZeus
  • [Java][算法 哈希]Day 01---LeetCode 热题 100---01~03
  • 基于华为云欧拉操作系统(HCE OS)容器化部署传统应用(Redis+Postgresql+Git+SpringBoot+Nginx)
  • 【Network Management】AUTOSAR架构下CanNm User Data详解
  • echarts使用之地图(五)
  • 【几分钟】快速熟悉torch.save()、torch.load()、torch.nn.Module.load_state_dict()
  • ONLYOFFICE文档8.0新功能浅探
  • 软件测试学习笔记-测试用例的编写
  • 项目学习记录
  • MGIE官网体验入口 苹果多模态大语言模型AI图像编辑工具在线使用地址
  • 【Google Bard】免费生成图像——功能和使用方法详解