温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java线程池相关知识点有哪些

发布时间:2022-01-15 16:17:09 阅读:167 作者:iii 栏目:大数据
Java开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

Java线程池相关知识点有哪些

1. 线程池概述

1.1 什么是线程池

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

1.2 为什么使用线程池

  • 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁的开销。
  • 提高响应速度:当任务到达时,任务可以不需要等待线程创建就能立即执行。
  • 提高线程的可管理性:线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配、调优和监控。

2. Java中的线程池

2.1 Executor框架

Java通过Executor框架提供线程池的支持。Executor框架是一个接口,它定义了一个执行任务的方法execute(Runnable command)ExecutorServiceExecutor的子接口,提供了更丰富的线程池管理功能。

2.2 线程池的创建

Java提供了Executors工厂类来创建不同类型的线程池:

  • FixedThreadPool:固定大小的线程池。
  • CachedThreadPool:可缓存的线程池。
  • SingleThreadExecutor:单线程的线程池。
  • ScheduledThreadPool:支持定时及周期性任务执行的线程池。
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);

2.3 线程池的核心参数

线程池的核心参数包括:

  • corePoolSize:核心线程数,线程池中保持的最小线程数。
  • maximumPoolSize:最大线程数,线程池中允许的最大线程数。
  • keepAliveTime:线程空闲时间,超过这个时间,多余的线程会被终止。
  • unitkeepAliveTime的时间单位。
  • workQueue:任务队列,用于保存等待执行的任务。
  • threadFactory:线程工厂,用于创建新线程。
  • handler:拒绝策略,当任务太多无法处理时的处理策略。

2.4 线程池的工作流程

  1. 当提交一个新任务时,线程池会检查当前线程数是否小于corePoolSize,如果是,则创建新线程执行任务。
  2. 如果当前线程数大于等于corePoolSize,则将任务放入workQueue中等待执行。
  3. 如果workQueue已满且当前线程数小于maximumPoolSize,则创建新线程执行任务。
  4. 如果workQueue已满且当前线程数等于maximumPoolSize,则根据handler策略处理任务。

2.5 线程池的拒绝策略

当线程池无法处理新任务时,会触发拒绝策略。Java提供了四种内置的拒绝策略:

  • AbortPolicy:直接抛出RejectedExecutionException异常。
  • CallerRunsPolicy:由调用线程处理该任务。
  • DiscardPolicy:直接丢弃任务,不抛出异常。
  • DiscardOldestPolicy:丢弃队列中最老的任务,然后重新尝试执行任务。

3. 线程池的使用

3.1 提交任务

可以通过execute()方法提交任务,也可以通过submit()方法提交任务并获取Future对象。

ExecutorService executor = Executors.newFixedThreadPool(5);
executor.execute(() -> {
    // 任务代码
});

Future<?> future = executor.submit(() -> {
    // 任务代码
});

3.2 关闭线程池

可以通过shutdown()方法平滑地关闭线程池,或者通过shutdownNow()方法立即关闭线程池。

executor.shutdown(); // 平滑关闭
executor.shutdownNow(); // 立即关闭

3.3 监控线程池

可以通过ThreadPoolExecutor提供的方法监控线程池的状态:

  • getPoolSize():获取当前线程池中的线程数。
  • getActiveCount():获取正在执行任务的线程数。
  • getCompletedTaskCount():获取已完成的任务数。
  • getTaskCount():获取总任务数。
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);
int poolSize = executor.getPoolSize();
int activeCount = executor.getActiveCount();
long completedTaskCount = executor.getCompletedTaskCount();
long taskCount = executor.getTaskCount();

4. 线程池的优化

4.1 合理设置线程池大小

线程池的大小设置需要根据具体的应用场景和系统资源来决定。通常可以通过以下公式估算:

  • CPU密集型任务corePoolSize = CPU核心数 + 1
  • IO密集型任务corePoolSize = CPU核心数 * 2

4.2 选择合适的任务队列

任务队列的选择对线程池的性能有很大影响。常用的队列有:

  • LinkedBlockingQueue:无界队列,适合任务量较大的场景。
  • ArrayBlockingQueue:有界队列,适合任务量可控的场景。
  • SynchronousQueue:不存储元素的队列,适合任务量较小的场景。

4.3 使用自定义线程工厂

可以通过自定义线程工厂来设置线程的名称、优先级等属性,方便调试和监控。

ThreadFactory threadFactory = new ThreadFactory() {
    private final AtomicInteger threadNumber = new AtomicInteger(1);

    @Override
    public Thread newThread(Runnable r) {
        Thread thread = new Thread(r, "my-thread-" + threadNumber.getAndIncrement());
        thread.setPriority(Thread.NORM_PRIORITY);
        return thread;
    }
};

ExecutorService executor = Executors.newFixedThreadPool(5, threadFactory);

4.4 使用自定义拒绝策略

可以通过实现RejectedExecutionHandler接口来自定义拒绝策略,以满足特定的业务需求。

RejectedExecutionHandler handler = new RejectedExecutionHandler() {
    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        // 自定义拒绝策略
    }
};

ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(100), handler);

5. 总结

线程池是Java并发编程中非常重要的工具,合理使用线程池可以显著提高系统的性能和稳定性。通过理解线程池的工作原理、核心参数、拒绝策略以及优化方法,可以更好地在实际项目中应用线程池,提升系统的并发处理能力。

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

原文链接:https://my.oschina.net/u/4248433/blog/4611897

AI

开发者交流群×