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

简单模拟实现一个线程池

池(Pool)是一个非常重要的思想方法. 内存池, 进程池, 连接池, 常量池......

 

那么, 为什么从池子里取就比从系统这里创建线程更快更高效呢?

 

线程池最⼤的好处就是减少每次启动、销毁线程的损耗。

标准库中的线程池 

• 使⽤ Executors.newFixedThreadPool(10) 能创建出固定包含 10 个线程的线程池.

• 返回值类型为 ExecutorService.

• 通过 ExecutorService.submit 可以注册⼀个任务到线程池中.

//线程池的使用
public class Demo23 {
    public static void main(String[] args) {
        ExecutorService service = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 1000; i++) {
            service.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("hello");
                }
            });
        }
    }
}

 

Executors 创建线程池的⼏种⽅式

• newFixedThreadPool: 创建固定线程数的线程池

• newCachedThreadPool: 创建线程数⽬动态增⻓的线程池.

• newSingleThreadExecutor: 创建只包含单个线程的线程池.

• newScheduledThreadPool: 设类似于定时器的效果.添加一些任务,任务都在后续的某个时刻再执行.被执行的时候不是只有一个扫描线程来执行任务, 可能是由多个线程共同执行所有的任务.

线程池对象搞好了之后, 使用submit方法, 就可以把任务添加到线程池中.

除了上述这些线程池之外,标准库还提供了一个接口更丰富的线程池类.

 

 

 

 

 

上面谈到的线程池,
—组线程池,是封装过的 Executors.

一组线程池,ThreadPoolExecutor原生的.
用哪个都可以,主要还是看实际的需求.
 

模拟实现一个线程池 

class MyThreadPool {
    private BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
    // 通过这个方法, 将任务添加到线程池中
    public void submit(Runnable runnable) throws InterruptedException {
        queue.put(runnable);
    }
    // n 表示线程池里有几个线程
    // 创建了一个固定数量的线程池
    public MyThreadPool(int n) {
        for (int i = 0; i < n; i++) {
            Thread t1 = new Thread(() -> {
                while (true) {
                    try {
                        // 取任务, 并执行任务
                        Runnable runnable = queue.take();
                        runnable.run();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            t1.start();
        }
    }

}

// 模拟实现一个线程池
public class Demo24 {
    public static void main(String[] args) throws InterruptedException {
        MyThreadPool pool = new MyThreadPool(4);
        for (int i = 0; i < 1000; i++) {
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + " hello");
                }
            });
        }
    }
}

相关文章:

  • Redis数据结构-String字符串
  • Unity 中导入的VRM模型渲染为VRoid风格
  • python学智能算法|模拟退火算法
  • ptython setup.py install 设置python包编译时的并行数
  • eNSP下载安装(eNsp、WinPcap、Wireshark、VirtualBox下载安装)
  • 【接口测试】使用Requests库发送POST请求
  • 1分钟快速了解——Java几种常见的锁
  • Django Admin: 实现基于数据库实际值的动态过滤器
  • Unity游戏制作中的C#基础(6)方法和类的知识点深度剖析
  • 前端如何转战鸿蒙
  • 通过LM Studio本地私有化部署DeepSeek-R1模型,无网络也能用
  • 【Java】集成easyexcel
  • 最新版IDEA下载安装教程
  • LangChain-基础(prompts、序列化、流式输出、自定义输出)
  • ESP32 websocket-client
  • 创建一个简单的spring boot+vue前后端分离项目
  • LangChain大模型应用开发:自定义工具调用
  • 基于 Highcharts 实现 Vue 中的答题统计柱状图组件
  • vue3 采用xlsx库实现本地上传excel文件,前端解析为Json数据
  • MES系统中物料核心属性定义
  • 中信银行资产管理业务中心原副总裁罗金辉一审被控受贿超4437万
  • 国家发改委:系统谋划7方面53项配套举措,推动民营经济促进法落地见效
  • 第1现场|俄媒称乌克兰网上出售北约对乌军培训手册
  • 43.2℃!河南林州打破全省5月最高温纪录,明后天高温将持续
  • 国家主席习近平任免驻外大使
  • 这个死亡率第一的“老年病”,正悄悄逼近年轻人