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.将线程池提升为静态的,不要每次关闭。

  • 相关阅读:
    php -- php数组相关函数
    php -- 数组排序
    php -- in_array函数
    php -- 魔术方法 之 删除属性:__unset()
    无符号整型与有符号整型相运算规则
    N个节点的二叉树有多少种形态
    getopt_long
    typedef
    约瑟夫环问题算法(M)
    C语言基础
  • 原文地址:https://www.cnblogs.com/haitao-xie/p/6282727.html
Copyright © 2011-2022 走看看