线程池使用

简介: 线程池使用

什么是线程?

操作系统 能够进行运算 调度 的最小单位。

什么是线程池?

线程池是一种多线程处理形式。

newFixedTheadPool

概念:

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

特点:

1.创建的线程数量固定

2.创建的线程可以重复使用

3.提交一个任务,就创建一个线程,直到达到线程池的最大容量

4.有执行异常结束的线程,线程池会补充一个新的线程

5.使用无边界的队列来存储需要执行的任务

6.使用完成,需要手动关闭线程池

正是由于这些特性,使用newFixiedThreadPool进行多线程开发十分简单。

练习实例:

使用线程池前

public class IfNoThread {
   public static void testNo() throws InterruptedException {
       for (int i = 0; i <100 ; i++) {
               Thread.sleep(100);
               System.out.println("学生"+ i );
       }
   }
    public static void main(String[] args) throws InterruptedException {
        long startTime=System.currentTimeMillis(); //获取开始时间
        testNo();
        long endTime=System.currentTimeMillis(); //获取结束时间
        System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
    }
}

当使用线程池以后:

import java.util.concurrent.CountDownLatch;
/**
 * @BelongsProject: newFixedThreadPool
 * @BelongsPackage: PACKAGE_NAME
 * @Author: GuoYuan.Zhao
 * @CreateTime: 2022-12-30  08:50
 * @Description: TODO
 * @Version: 1.0
 */
public class CalaulationStudentsData implements Runnable {
    //学生数量
    int studentNumber;
    //锁存器
    CountDownLatch latch;
   /**
    * @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:39
     * @param: []
     * @return: void
     **/
    @Override
    public void run() {
        try {
            //计算学生学习数据的方法
            this.CalculationStudentData();
            //计数器减一
            latch.countDown();
        }catch (Exception e){
            throw new RuntimeException("学生进入学校执行数据异常"+e);
        }
    }
    /**
     * @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());
    }
}
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
 * @BelongsProject: newFixedThreadPool
 * @BelongsPackage: PACKAGE_NAME
 * @Author: GuoYuan.Zhao
 * @CreateTime: 2022-12-30  08:45
 * @Description: TODO
 * @Version: 1.0
 */
public class newThread {
    public static void test(){
        //实例化一个固定大小为10个线程的newFixedThreadPool线程池
        ExecutorService excutorService = Executors.newFixedThreadPool(10);
        //构造CountDownLatch传入数量为100,初始化的计数器大小为100,与学生数量对应。
        final CountDownLatch latch = new CountDownLatch(100);
        //计算100个学生进入学校的情况
        for (int i = 0; i <100 ; i++) {
            //线程提交任务
            excutorService.submit(new CalaulationStudentsData(i,latch));
        }
        try{
            //使调用该方法的主线程处于等待状态,当倒数到0时主线程才执行。
            latch.await();
        } catch (InterruptedException e) {
            throw new RuntimeException("学生进入学校多线程处理异常",e);
        }
        //关闭线程池
        excutorService.shutdown();
        return;
    }
    public static void main(String[] args) {
        long startTime=System.currentTimeMillis(); //获取开始时间
        test();
        long endTime=System.currentTimeMillis(); //获取结束时
        System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
}
}

原理分析:

相关文章
|
6月前
|
NoSQL Java 应用服务中间件
|
监控 Java
线程池的讲解和实现
线程池的讲解和实现
|
缓存 Java
常用的线程池有哪些?
常用的线程池有哪些?
109 0
|
Java 数据库连接 容器
关于线程池
关于线程池
87 0
|
消息中间件 监控 搜索推荐
线程池:我是谁?我在哪儿?
大家好,这篇文章跟大家探讨下日常使用线程池的各种姿势,重点介绍怎么在 Spring 环境中正确使用线程池。
303 1
线程池:我是谁?我在哪儿?
|
Java 程序员
我是一个线程池
我是一个线程池
|
Java Linux
C线程池
C线程池
119 0
C线程池
|
存储 安全 Java
线程池没你想的那么简单(上)
自己动手写一个五脏俱全的线程池,同时会了解到线程池的工作原理,以及如何在工作中合理的利用线程池。