zoukankan      html  css  js  c++  java
  • java 线程池简介

    1. 线程池简介
       通过前面的章节我们了解到如何去创建线程,但是如果我们每一次多去创建线程。我们是否回去想,既然是创建线程我们为什么不能像连接池一样呢。做到线程之间的复用呢,减少资源之间的让费呢?
         jdk为我们提供了多种线程池技术。通过Executors提供五种线程池,都是直接或间接继承自ThreadPoolExcecutor 线程池类。
    2. 线程池介绍

      newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

      newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

      newScheduledThreadPool 创建一个定长线程池,支持定时(scheduleWithFixedDelay()函数的initdelay 参数)周期(delay 参数)任务执行。

      newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

      newSingleThreadScheduledExecutor 创建一个单线程化的支持定时的线程池,可以用一个线程周期性执行任务(比如周期7天,一次任务才用1小时,使用多线程就会浪费资源)

    3. 实践 

      public class ExecutorsDemo {
      
        //创建线程池 private static ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); public static void main(String[] args) { cachedThreadPool.execute(new Runnable() { @Override public void run() { System.out.println("this is runnable"); } }); } }

        

    4. 踩过的坑
      Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
          at java.lang.Thread.start0(Native Method)
          at java.lang.Thread.start(Thread.java:597)
          at TestNativeOutOfMemoryError.main(TestNativeOutOfMemoryError.java:20)
      

       因为创建线程没有关闭shutdown。导致jvm创建过多的线程。
      解决办法:        1.关闭线程池
                       2.将线程池提升为静态的,不要每次关闭。

  • 相关阅读:
    不用递归实现List转Tree
    spring cloud stream 局部异常和全局异常混乱
    HTTP协议详解(真的很经典)
    Python3 多线程压测接口数据:写入到influxdb:通过grafana展示
    Eclipse使用git最简易流程
    oracle patch包一定要775的权限
    安装19c grid时CRS-1705错误
    Ubutun 设置开机启动程序
    利用selenium将edge浏览器里面的网页保存为pdf
    Ruckus ICX7150 Switch License Upgrade from 1G to 10G
  • 原文地址:https://www.cnblogs.com/haitao-xie/p/6282727.html
Copyright © 2011-2022 走看看