ThreadPoolExecutor创建线程池

利用ThreadPoolExecutor来创建线程池

一、引入依赖

<dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>16.0.1</version>
        </dependency>

二、直接上代码

ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("test" + "-thread-%d").build();

    ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 100, 600, TimeUnit.SECONDS,
        new ArrayBlockingQueue<>(65536), namedThreadFactory);
    @RequestMapping("pingTest/{ip}")
    public Result testPingOpenFiles(@PathVariable("ip") String ip) {
        int pingCount= 1000;
        while (pingCount-- > 0) {
            threadPoolExecutor.submit(() -> {
                try {
                    boolean b = MyUtils.ping(ip, 1, 5000);
                    log.info(System.currentTimeMillis() + "--------" + b);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                }
            });
        }
        return new Result(true);
    }

三、参数说明

  1. 参数 corePoolSize

表示线程池的常驻核心线程数。如果设置为 0,则表示在没有任何任务时,销毁线程池;如果大于 0,即使没有任务时也会保证线程池的线程数量等于此值;
应该结合实际业务设置此值的大小。若 corePoolSize 的值较小,则会出现频繁创建和销毁线程情况;若值较大,则会浪费系统资源。
2. 参数 maximumPoolSize

表示线程池最大可以创建的线程数。官方规定此值必须大于 0,也必须大于等于 corePoolSize 的值;
此值只有在任务比较多,且不能存放在任务队列时,才会用到。
3. 参数 keepAliveTime

表示线程的存活时间。当线程池空闲时并且超过了此时间,多余的线程就会销毁,直到线程池中的线程数等于 corePoolSize 的值为止;
若 maximumPoolSize 的值 等于 corePoolSize 的值,则线程池在空闲的时候不会销毁任何线程。
4. 参数 unit

表示存活时间的单位,配合 keepAliveTime 参数共同使用。
5. 参数 workQueue

表示线程池执行的任务队列;
当线程池的所有线程都在处理任务时,若来了新任务则会缓存到此任务队列中,然后等待执行。
6. 参数 threadFactory

表示线程的创建工厂,一般使用默认的线程创建工厂的方法 Executors.defaultThreadFactory()来创建线程。
7. 参数 RejectedExecutionHandler

表示指定线程池的拒绝策略,属于一种限流保护的机制;
当线程池的任务已经在缓存队列 workQueue 中存满了之后,并且不能创建新的线程来执行此任务时,就会用到此拒绝策略
四种拒绝策略
(1) AbortPolicy: 丢弃任务并抛出异常。
(2) DiscardPolicy:丢弃任务但不抛出异常。
(3) DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务
(4) CallerRunsPolicy:由调用线程处理该任务
四、submit()和execute方法区别
1.submit() 方法可以配合 Future来接收线程执行的返回值,而 execute() 不能接收返回值;
2.execute() 方法属于 Executor 接口的方法,而 submit() 方法则是属于 ExecutorService 接口的方法。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ThreadPoolExecutor是Java中的一个线程池类,可以用来管理和调度线程。它可以在需要时自动创建线程,并在不需要时回收线程,从而避免了频繁地创建和销毁线程的开销。ThreadPoolExecutor可以设置线程池的大小、任务队列的大小、线程池的拒绝策略等参数,以满足不同的需求。使用ThreadPoolExecutor可以提高程序的性能和稳定性,减少资源的浪费。 ### 回答2: ThreadPooExecutor是Java中的线程池框架,提供了一种方便的方式来管理线程,减少线程的创建和销毁次数,节约系统资源,同时提高程序的运行效率。 在使用ThreadPooExecutor创建线程池时,需要通过构造函数来初始化线程池的大小、线程的缓存队列、线程的生命周期等参数。其中,参数包括:corePoolSize(核心池大小),maximumPoolSize(最大池大小),keepAliveTime(线程池维护线程所允许的空闲时间),unit(计时单位)以及一个BlockingQueue(阻塞队列)。 当线程池中的线程数目超过了corePoolSize时,就会将任务加入BlockingQueue中,等待有空闲线程时执行。当BlockingQueue满时,就会创建新的线程执行任务。如此反复,直到线程池中的线程数目达到maximumPoolSize(最大线程池大小)。 当线程池中的线程数目超过了maximumPoolSize时,便会执行拒绝策略,对新的任务进行拒绝或抛出异常等处理。 在使用ThreadPooExecutor的时候,我们可以使用ThreadPoolExecutor类提供的execute()方法,将一个任务提交给线程池进行执行。线程池会自动将任务分配给其中的一个线程执行。任务完成后,线程会自动返回线程池,等待下一个任务的分配。 总的来说,ThreadPooExecutor是Java多线程编程中非常重要的工具,能够让我们更好地管理线程,提高程序的运行效率。但需要注意的是,当线程池的参数设置不当或者程序的运行流程不清晰时,可能会导致程序运行出错或者出现各种性能问题。因此,在使用ThreadPooExecutor创建线程池时,我们应该根据程序的实际需求来进行参数的设置和调整,保证线程池的高效和稳定运行。 ### 回答3: 线程池是Java多线程编程中非常重要的一个概念,它可以避免线程频繁创建和销毁所带来的开销,提高程序的性能和稳定性。而ThreadpoolExecutor是Java中线程池的一个实现类,它可以通过一些参数的设置来调整线程池的大小,队列容量等属性,实现线程池的优化和控制。 ThreadpoolExecutor的主要构造函数有四个参数:corePoolSize,maximumPoolSize,keepAliveTime和unit。其中corePoolSize表示线程池中核心线程的数量,maximumPoolSize表示线程池中最多允许的线程数量,keepAliveTime表示没有任务时,多余的线程保留的时间,unit为保留时间的单位。 当线程数小于核心线程数时,会创建新的线程;当线程数大于核心线程数时,会把任务放入缓存队列中;当线程数大于最大线程数时,会触发线程池的拒绝策略,例如抛出异常或者忽略新任务等。 ThreadpoolExecutor中还有一个重要的属性——BlockingQueue队列,用来存储等待被执行的任务,同时它也是线程池的瓶颈所在。如果处理任务的速度太慢,缓存队列会变得越来越大,导致内存占用过多,甚至OOM。 因此,好的线程池应该根据任务类型的特性和负载情况设置合理的线程数和队列容量,避免线程池在高负载等情况下失控,同时也能提高程序的性能和稳定性。线程池是多线程编程中非常重要的一环,学习和掌握ThreadpoolExecutor的用法和优化方法将会对Java编程的水平和职业发展都有益处。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值