线程池知识点整理

mport java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.*;

/**
 * 一, 线程池: 提供了一个线程队列,队列中保存着等待状态的线程,避免了频繁的创建和销毁线程造成的额外开销,提高了相应速度.
 * 二, 线程池体系结构:
 * java.util.concurrent.Executor: 负责线程使用与调度的根接口
 *   |-- **ExecutorService 子接口 : 线程池的主要接口
 *      |-- ThreadPoolExecutor 线程池的实现类
 *      |-- ScheduledExecutorService 子接口: 负责线程的调度
 *          |-- ScheduledThreadPoolExecutor : 继承 ThreadPoolExecutor,实现ScheduledExecutorService
 *
 *  三,工具类: Executors
 *  ExecutorService  newFixedThreadPool(); : 创建固定大小的线程池(等待线程的队列的最大值为int的最大值)
 *  ExecutorService  newCachedThreadPool(); : 缓存线程池,线程池中的线程数量不固定,可以根据需求自动的更改数量.(线程的最大数量为int的最大值)
 *  ExecutorService  newSingleThreadPool();  : 创建单个线程的线程池,池中只有一个线程.
 *
 *  ScheduledExecutorService  newScheduledThreadPool(); : 创建固定大小的线程,可以延迟或定时的执行任务.
 */
public class ThreadPoolDemo {
    /**
     * 项目中通常是直接创建ThreadPoolExecutor的实例,参数详解如下
     * public ThreadPoolExecutor(int corePoolSize,//核心线程数,即使空闲也保留在线程中的线程数,除非设置allowCoreThreadTimeOut
     *                                             // CPU核数 = Runtime.getRuntime().availableProcessors();
     *                                             // (一般配置规律:CPU密集型:核心线程数 = CPU核数 + 1,IO密集型:核心线程数 = CPU核数 * 2)
     *                               int maximumPoolSize,// 池中允许的最大线程数
     *                               long keepAliveTime,// 当线程数大于内核时,这是多余的空闲线程在终止前等待新任务的最大的时间
     *                               TimeUnit unit,// keepAliveTime的时间单位
     *                               BlockingQueue<Runnable> workQueue,// 用于在执行任务之前使用的队列,这个队列将仅保存execute方法提交的Runnable任务
     *                               ThreadFactory threadFactory,// 执行程序创建新线程时使用的工厂(通常用来给线程赋名称值)
     *                               RejectedExecutionHandler handler);// 线程拒绝策略(达到线程限制或队列已满)
     *
     */
    /*
    接下来说说线程池的拒绝策略  :
    JDK实现的拒绝有四种:
        1, AbortPolicy : 该策略会直接抛异常,阻止系统正常工作
        2,CallerRunsPolcy: 如果线程池已经关闭则丢弃当前任务,只要线程池没有关闭,就直接在execute方法的调用线程中运行被拒绝的任务,
            虽然减少了任务丢弃的几率,但是任务提交线程的性能将很可能急剧下降.
        3,DiscardOldestPolicy: 如果线程池已经关闭则丢弃当前任务,否则就丢弃最旧的未处理的任务,然后重试execute方法.
        4,DiscardPolicy: 默默的丢弃没法处理的任务,如果允许线程任务丢失则可采用该拒绝策略.
     最后还有一种自定义的拒绝策略
        5,自定义的拒绝策略: 实现RejectedExecutionHandler接口 并重写其中的rejectedExecution()方法.参数r为任务线程,executor为当前线程池.

    (默认拒绝策略源码如下)
    //The default rejected execution handler
    private static final RejectedExecutionHandler defaultHandler =
            new AbortPolicy();
     线程池的默认拒绝策略为  AbortPolicy
     */
    public static void main(String[] args) throws Exception{
        // 测试调度线程池
        ScheduledExecutorService excutor = Executors.newScheduledThreadPool(4);
        ArrayList<ScheduledFuture<Integer>> futures = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            ScheduledFuture<Integer> schedule = excutor.schedule(() -> {
                int num = new Random().nextInt(100);
                System.out.println(Thread.currentThread().getName()+" : "+num);
                return num;
            }, 1, TimeUnit.SECONDS);// 延迟一秒执行任务
            futures.add(schedule);
        }
        excutor.shutdown();// 以平和的方式关闭线程池(等池中的线程执行完毕之后再关闭线程池)
//        excutor.shutdownNow()// 暴力关闭线程池
        for (ScheduledFuture<Integer> future : futures) {
            System.out.println(future.get());
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java是一种广泛使用的面向对象编程语言,具有强大的跨平台能力、安全性、可移植性和高度的抽象性。对于Java程序设计的知识点整理,我会提供一个简要概述和关键部分的介绍,但请注意,由于字数限制,这里无法提供完整的2000字详细内容。以下是Java程序设计中的一些核心知识点: 1. **Java概述**: - Java的历史和发展 - Java的特性和优势(如平台无关性、垃圾回收机制) - Java的核心API和类库 2. **Java语法基础**: - 数据类型和变量 - 运算符和表达式 - 控制结构(if-else、switch、循环等) - 数组和集合框架 3. **面向对象编程**: - 抽象类与接口的区别 4. **构造函数和析构器**: - 构造函数的作用和生命周期 - 初始化块和析构器的使用 5. **异常处理**: - 异常的概念和分类 - try-catch-finally语句结构 - 自定义异常和抛出异常 6. **输入输出流**: - 字符流(`System.out.println()`) - 文件I/O操作 - 输入/输出流的缓冲区和关闭资源 7. **类加载器和包**: - 类加载过程 - 包的作用和命名规则 8. **多线程**: - Thread类和Runnable接口 - 互斥量、信号量和条件变量 - 线程池和并发工具类 9. **集合框架**: - 核心类(List, Set, Map) - 集合接口(Iterable, Iterator) - 泛型和集合容器的使用 10. **IO流与网络编程**: - Socket编程 - ServerSocket和ClientSocket - 套接字工厂和NIO(非阻塞I/O) 11. **并发编程工具**: - CompletableFuture - ExecutorService和ThreadFactory - Future和Callable 12. **JVM和内存管理**: - 堆和栈的区别 - Garbage Collection(垃圾回收)机制 13. **数据库访问**: - JDBC连接数据库 - ORM框架(Hibernate, MyBatis) 14. **Spring框架**: - IoC和AOP概念 - Bean容器和配置文件 15. **测试驱动开发(TDD)**: - JUnit单元测试 - Mockito模拟对象 16. **Spring Boot**: - 简化Java应用的初始配置 - RESTful API的创建 相关问题: 1. Java的三大特性是什么? 2. 你能解释一下Java中的封装吗? 3. JUnit在单元测试中的作用是什么? 4. Spring框架如何简化开发流程? 如果想深入了解每个知识点,你可以查阅相关的教程书籍、在线文档或视频课程进行学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值