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

posted @ 2017-01-13 14:57  haitao.xie  阅读(303)  评论(0编辑  收藏  举报