线程池概念简单入门

简介: 线程池概念简单入门

线程

  是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。

查看进程:pslist或 tasklist

查看进程下的线程:pslist -dmx pid号(需要安装PsTools)

池化技术

  把一些能够复用的东西(比如说数据库连接、线程)提前放到池中,使用时从池子里取,用完了再放回池子中。避免重复创建、销毁的开销,从而极大提高性能。

  看到这个池那个池的也不用蒙,一定是为了复用某些资源。

  总之池子是存放东西、管理东西的,池子就是一种容器。


线程池简介

 刚才也简单介绍了线程的概念,为什么要引入线程池呢?要讲到线程的生命周期,每个线程都有“创建——使用——销毁”这样一个大致的周期,创建、销毁都是要耗费资源的(时间、cpu等),线程数越多,耗费的资源越多。但我们又不得不使用多线程,那么线程池就出现了,解决了处理短时间内创建和销毁线程代价较大的弊端。

java线程池分类


实操

 newFixedTheadPool是六种常用线程池的其中一种,newFixedThreadPool的特点是他的核心线程数和最大线程数是一致的,并且是一个固定线程数的线程池。线程池的大小一旦达到最大值后,再有新的任务提交时则放入无界阻塞队列中,等到有线程空闲时,再从队列中取出任务继续执行。

public class CalaulationStudentsData implements Runnable{
    //学生数量
    int studentNumber;
    //锁存器
    CountDownLatch latch;
    @Override
    public void run() {
        try {
            //计算学生学习数据的方法
            this.CalculationStudentData();
            //计数器减一
            latch.countDown();
        }catch (Exception e){
            throw new RuntimeException("学生进入学校执行数据异常"+e);
        }
    }
    /**
     * @Author:Guoyuan.Zhao
     * @Description:构造函数中传入学生的id
     * @CreateTime:  2022/12/30 9:38
     * @param: [studentNumber, latch]
     * @return:
     **/
    public CalaulationStudentsData(int studentNumber, CountDownLatch latch){
        this.studentNumber=studentNumber;
        this.latch=latch;
    }
    /**
     * @Author:Guoyuan.Zhao
     * @Description:计算学生数据的方法
     * @CreateTime:  2022/12/30 9:40
     * @param: []
     * @return: void
     **/
    private void CalculationStudentData() throws InterruptedException {
        //输出学生编号和执行该任务的线程名称
        Thread.sleep(100);
        System.out.println("学生" + studentNumber+"进入学校" + "接待的老师id(用到的线程号)" + Thread.currentThread().getId());
    }
}
public class threadPool {
    public static void main(String[] args) {
        long startTime=System.currentTimeMillis(); //获取开始时间
        //实例化一个固定大小为10个线程的newFixedThreadPool线程池
        ExecutorService excutorService = Executors.newFixedThreadPool(20);
        //构造CountDownLatch传入数量为100,初始化的计数器大小为100,与学生数量对应。
        final CountDownLatch latch = new CountDownLatch(100);
        //计算100个学生进入学校的情况
        for (int i = 0; i <100 ; i++) {
            excutorService.submit(new CalaulationStudentsData(i,latch));//线程提交任务
        }
        try{
            latch.await(); //使调用该方法的主线程处于等待状态,当倒数到0时主线程才执行。
        } catch (InterruptedException e) {
            throw new RuntimeException("学生进入学校多线程处理异常",e);
        }finally {
            excutorService.shutdown();//关闭线程池
        }
        long endTime=System.currentTimeMillis(); //获取结束时
        System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
    }
}

性能对比

运行前:

运行中:不使用线程池(100个线程)

运行中:使用线程池(10个线程)

相关文章
|
2月前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
4月前
|
Go 调度 开发者
[go 面试] 深入理解进程、线程和协程的概念及区别
[go 面试] 深入理解进程、线程和协程的概念及区别
|
25天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
2月前
|
算法 NoSQL Java
Springboot3新特性:GraalVM Native Image Support和虚拟线程(从入门到精通)
这篇文章介绍了Spring Boot 3中GraalVM Native Image Support的新特性,提供了将Spring Boot Web项目转换为可执行文件的步骤,并探讨了虚拟线程在Spring Boot中的使用,包括如何配置和启动虚拟线程支持。
116 9
Springboot3新特性:GraalVM Native Image Support和虚拟线程(从入门到精通)
|
1月前
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
34 1
|
1月前
|
Java 数据处理 开发者
Java多线程编程的艺术:从入门到精通####
【10月更文挑战第21天】 本文将深入探讨Java多线程编程的核心概念,通过生动实例和实用技巧,引导读者从基础认知迈向高效并发编程的殿堂。我们将一起揭开线程管理的神秘面纱,掌握同步机制的精髓,并学习如何在实际项目中灵活运用这些知识,以提升应用性能与响应速度。 ####
47 3
|
2月前
|
Java
Java中的多线程编程:从入门到精通
本文将带你深入了解Java中的多线程编程。我们将从基础概念开始,逐步深入探讨线程的创建、启动、同步和通信等关键知识点。通过阅读本文,你将能够掌握Java多线程编程的基本技能,为进一步学习和应用打下坚实的基础。
|
3月前
|
数据采集 消息中间件 并行计算
进程、线程与协程:并发执行的三种重要概念与应用
进程、线程与协程:并发执行的三种重要概念与应用
63 0
|
3月前
|
安全 数据库连接 API
C#一分钟浅谈:多线程编程入门
在现代软件开发中,多线程编程对于提升程序响应性和执行效率至关重要。本文从基础概念入手,详细探讨了C#中的多线程技术,包括线程创建、管理及常见问题的解决策略,如线程安全、死锁和资源泄露等,并通过具体示例帮助读者理解和应用这些技巧,适合初学者快速掌握C#多线程编程。
83 0
|
4月前
|
缓存 前端开发 JavaScript
一篇文章助你搞懂java中的线程概念!纯干货,快收藏!
【8月更文挑战第11天】一篇文章助你搞懂java中的线程概念!纯干货,快收藏!
39 0
一篇文章助你搞懂java中的线程概念!纯干货,快收藏!