线程池的使用

Posted 王思琪^

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池的使用相关的知识,希望对你有一定的参考价值。

什么是线程

     是操作系统能够进行运算调度的最小单位。(例如: cpu 对前端发往后端的一个请求的处理叫一个线程)

什么是线程池

     线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。

线程池的优势

  1.  降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗;
  2. 提高系统响应速度,当有任务到达时,无需等待新线程的创建便能立即执行;
  3. 方便线程并发数的管控,线程若是无限制的创建,不仅会额外消耗大量系统资源,更是占用过多资源而阻塞系统或oom等状况,从而降低系统的稳定性。线程池能有效管控线程,统一分配、调优,提供资源使用率;
  4. 更强大的功能,线程池提供了定时、定期以及可控线程数等功能的线程池,使用方便简单。

 线程池流程

 线程池实例

public class Client 
    public static void main(String[] args) 
        //实例化一个固定大小为10个线程的newFixedThreadPool线程池
        ExecutorService executorService = Executors.newFixedThreadPool(80);
        List<String> number = new ArrayList<>();
        for(int i = 0 ; i <1000;i++)
            number.add("多了"+i+"学习");
        
        final CountDownLatch latch = new CountDownLatch(number.size());
        //计算1000个学生的学习数据
        for(int i = 0;i<number.size();i++)
            //线程提交任务
            executorService.submit(new Study(i,latch,number));
        
        try
            //使调用该方法的主线程处于等待状态,当倒数到0时主线程才执行
            latch.await();
         catch (InterruptedException e) 
            throw new RuntimeException("王思琪学习如何学习多线程处理异常",e);
        
        //关闭线程池
        executorService.shutdown();
    
public class Study implements Runnable 
    int studyNumber;
    CountDownLatch latch;
    List<String> number;

    public Study(int studyNumber,CountDownLatch latch,List<String> number)
        this.studyNumber=studyNumber;
        this.latch=latch;
        this.number=number;
    

    private void start()
        //输出学生编号和执行该任务的线程名称
        System.out.println("王思琪学了"+studyNumber+"次如何学习"+Thread.currentThread().getName());
    
    @Override
    public void run() 
        //计算学生学习数据的方法
        this.start();
        //计数器容量减一
        latch.countDown();
    

以上是关于线程池的使用的主要内容,如果未能解决你的问题,请参考以下文章

java---线程池的使用

Java并发编程实践读书笔记 线程池的使用

深入源码分析Java线程池的实现原理

深入源码分析Java线程池的实现原理

深入源码,深度解析Java 线程池的实现原理

深入源码,深度解析Java 线程池的实现原理