javaEE学习总结(三)多线程--多线程的案例

一、线程池

  1. 什么是线程池
  • 介绍
    线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。
  • 线程的执行流程
    当任务来了之后,线程池的执行流程是:先判断当前线程数是否大于核心线程数?如果结果为 false,则新建线程并执行任务;如果结果为 true,则判断任务队列是否已满?如果结果为 false,则把任务添加到任务队列中等待线程执行,否则则判断当前线程数量是否超过最大线程数?如果结果为 false,则新建线程执行此任务,否则将执行线程池的拒绝策略

javaEE学习总结(三)多线程--多线程的案例_第1张图片

  • 线程的拒绝策略
    当任务过多且线程池的任务队列已满时,此时就会执行线程池的拒绝策略。
    线程池的拒绝策略默认有以下 4 种:
    AbortPolicy:中止策略,线程池会抛出异常并中止执行此任务;
    CallerRunsPolicy:把任务交给添加此任务的(main)线程来执行;
    DiscardPolicy:忽略此任务,忽略最新的一个任务;
    DiscardOldestPolicy:忽略最早的任务,最先加入队列的任务。

    默认的拒绝策略为 AbortPolicy 中止策略。

  1. 线程池的作用
    在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。如果使用线程池那么就可以减少每次启动、销毁线程的损耗
  2. 如何创建线程池
    JAVA中创建线程池主要有两类方法,一类是通过Executors工厂类提供的方法,该类提供了4种不同的线程池可供使用。另一类是通过ThreadPoolExecutor类进行自定义创建。
    (1) 通过Executors类提供的方法创建线程池
  • newFixedThreadPool

创建一个固定大小的线程池,可控制并发的线程数,超出的线程会在队列中等待。

private static void createFixedThreadPool(){
   
        ExecutorService executorService= Executors.newFixedThreadPool(3);
        for (int i = 0; i < 10; i++) {
   
            final int index=i;
            executorService.execute(()->{
   
                System.out.println(Thread.currentThread().getName()+" "+index);
                try {
   
                    sleep(1000);
                } catch (InterruptedException e) {
   
                    e.printStackTrace();
                }
            });
        }
    }
  • newCachedThreadPool

创建一个可缓存的线程池,若线程数超过处理所需,缓存一段时间后会回收,若线程数不够,则新建线程。

private static 

你可能感兴趣的:(java-ee,学习,java)