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 接口的方法。

经验分享 程序员 微信小程序 职场和发展