线程池使用

简介: 线程池使用

什么是线程?

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

什么是线程池?

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

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");
}
}

原理分析:

相关文章
|
23天前
|
存储 缓存 安全
线程池相关详解
线程池相关详解
|
15天前
|
Java
线程池的实现
线程池的实现
13 0
|
8月前
|
Java
6. 实现简单的线程池
6. 实现简单的线程池
32 0
|
存储 Java 测试技术
13.一文彻底了解线程池
大家好,我是王有志。线程池是Java面试中必问的八股文,涉及到非常多的问题,今天我们就通过一篇文章,来彻底搞懂Java面试中关于线程池的问题。
374 2
13.一文彻底了解线程池
|
12月前
|
缓存 Java
常用的线程池有哪些?
常用的线程池有哪些?
84 0
|
12月前
|
前端开发 Java 调度
你了解线程池吗
你了解线程池吗
59 0
|
缓存 算法 Java
线程池和使用
线程池是一种用于管理和复用线程的机制。在多线程应用程序中,线程的创建和销毁需要消耗大量的系统资源,而线程池可以通过预先创建一定数量的线程,然后将任务分配给这些线程来避免频繁地创建和销毁线程,从而提高应用程序的性能和效率。线程池还可以控制并发线程的数量,避免过多的线程竞争资源导致的性能下降和系统崩溃。线程池是多线程编程中常用的一种技术,被广泛应用于各种类型的应用程序中。
60 0
线程池和使用
KeyAffinityExecutor 线程池
KeyAffinityExecutor 线程池
|
缓存 NoSQL Java
【线程池】
【线程池】
129 0

热门文章

最新文章