线程池常用方法

本文详细介绍了Java中线程池的使用,重点讲解了Executors工具类的三大方法,包括单线程、固定线程池和缓存线程池。此外,还深入讨论了七大参数、四种拒绝策略,并结合CPU密集型和IO密集型场景进行了调优实例。

线程池

java中经常需要用到多线程来处理一些业务,我们非常不建议单纯使用继承Thread或者实现Runnable接口的方式来创建线程,那样势必有创建及销毁线程耗费资源、线程上下文切换问题。同时创建过多的线程也可能引发资源耗尽的风险,这个时候引入线程池比较合理,方便线程任务的管理。java中涉及到线程池的相关类均在jdk1.5开始的java.util.concurrent包中,涉及到的几个核心类及接口包括:Executor、Executors、ExecutorService、ThreadPoolExecutor、FutureTask、Callable、Runnable等。

Executors工具类(三大方法)

ExecutorService pool1 = Executors.newSingleThreadExecutor();//单个线程
ExecutorService pool2 = Executors.newFixedThreadPool(5);//创建一个固定线程池大小
ExecutorService pool3 = Executors.newCachedThreadPool();//自动伸缩,遇强则强

public class xianchengpool {
    public static void main(String[] args) {
        ExecutorService pool1 = Executors.newSingleThreadExecutor();//单个线程
        ExecutorService pool2 = Executors.newFixedThreadPool(5);//创建一个固定线程池大小
        ExecutorService pool3 = Executors.newCachedThreadPool();//自动伸缩,遇强则强

        try {
            for (int i = 0; i < 10; i++) {
                pool1.execute(()->{
                    System.out.println(Thread.currentThread().getName()+ " 11" );
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            pool1.shutdown();
        }

    }
}

七大参数

int corePoolSize //核心线程池大小
int maximumPoolSize //最大核心线程池大小
long keepAliveTime //超时了没有人调用就会释放
TimeUnit unit //超时单位
BlockingQueue workQueue //阻塞队列
ThreadFactory threadFactory //线程工厂,创建线程的,一般不用动
RejectedExecutionHandler handle //拒绝策略

四种拒绝策略

new ThreadPoolExecutor .AbortPolicy() //银行满了,还有人进来,不处理这个人的,抛出异常
new ThreadPoolExecutor.CallerRunsPolicy() //哪来的去哪里!
new ThreadPoolExecutor.DiscardPolicy() //队列满了,丢掉任务,不会抛出异常!
new ThreadPoolExecutor.DiscardOldestPolicy() //队列满了,尝试去和最早的竞争,也不会抛出异常!

举例

public class pool2 {
    public static void main(String[] args) {
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                2,
                5,
                3,
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );

        try {
            for (int i = 0; i < 8; i++) {
                pool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+ " 11" );
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            pool.shutdown();
        }

    }
}

CPU密集型和IO密集型(用于调优)

首先知道一个概念CPU运行效率远大于IO

这两种类型都是设置在设置最大线程的地方

cpu密集型可以保证cpu的运行效率 几何默认就是几
Runtime.getRuntime().availableProcessors()

        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                2,
                Runtime.getRuntime().availableProcessors(),
                3,
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );

io密集型 判断程序中消耗io的线程 设置时一般设置消耗线程的两倍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Andrew0219

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值