线程池的理解及使用

Posted 小码仙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池的理解及使用相关的知识,希望对你有一定的参考价值。


原文链接:https://blog.csdn.net/syoung99/article/details/52526475

小仙说明:修正原文部分别字及方法名错误



1、初识线程池


  根据系统自身的环境情况,有效的限制执行线程的数量,使得运行效果达到最佳。线程池主要是通过控制执行的线程的数量,超出数量的线程排队等候,等待有任务执行完毕,再从队列最前面取出任务执行。



2、线程池作用


  减少创建和销毁线程的次数,每个工作线程可以多次使用,可根据系统情况调整执行的线程数量,防止消耗过多内存。



3、使用(小仙部分补充)


  ExecutorService:线程池接口

  ExecutorService pool = Executors.常见线程池


  ScheduledExecutorService:周期性线程池接口

  ScheduledExecutorService pool = Executors.常见周期性线程池


  eg:

  ExecutorService pool = Executors.newSingleThreadExecutor();

  ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);



4、常见线程池


  ① newSingleThreadExecutor

  单个线程的线程池,即线程池中每次只有一个线程工作,单线程串行执行任务。


  ② newFixedThreadPool(n)

  固定数量的线程池,每提交一个任务就是一个线程,直到达到线程池的最大数量,然后后面进入等待队列直到前面的任务完成才继续执行。


  ③ newCacheThreadPool(推荐使用)

  可缓存线程池,当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又智能的添加新线程来执行。


  ④ newScheduleThreadPool

  大小无限制的线程池,支持定时和周期性的执行线程。



5、实例(小仙亲测,非转载)


  ① newSingleThreadExecutor


核心代码:

ExecutorService pool = Executors.newSingleThreadExecutor();
pool.execute(t1);


执行样例:


线程池的理解及使用

  可以看到同时只有1个线程(1个线程名)在执行。


  ② newFixedThreadPool(n)


核心代码:

ExecutorService pool = Executors.newFixedThreadPool(3);
pool.execute(t1);


执行样例:


线程池的理解及使用

  可以看到,当指定线程池数量为3时,最多同时有3个线程(3个线程名)在线程池中执行,执行完一个,再从排队队列里拿出一个继续执行。


  ③ newCacheThreadPool


核心代码:

ExecutorService pool = Executors.newCachedThreadPool();
pool.execute(t1);


执行样例:

线程池的理解及使用


  可以看到,5个线程(5个线程名)都在线程池中执行了,该线程池无限大,灵活智能。


  ④ newScheduleThreadPool


核心代码:

ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);
pool.schedule(t1, 1, TimeUnit.SECONDS);


执行样例:

线程池的理解及使用


  可以看到,一秒打印一行日志,线程池固定了3个线程(3个线程名),按照delay时间达到后开始执行,执行完一个即收回,给后面新线程使用。

  另外,它还有一个专用于单线程的newSingleThreadScheduledExecutor,使用方法类似:


核心代码:

ScheduledExecutorService pool = Executors.newSingleThreadScheduledExecutor();
pool.schedule(t1, 1, TimeUnit.SECONDS);


执行样例:

线程池的理解及使用


(本文结束)


每天成长一小步,一年进步一大步。

——【小码仙】

xmx-code

以上是关于线程池的理解及使用的主要内容,如果未能解决你的问题,请参考以下文章

Java并发多线程编程——线程池

java中线程池的理解和使用

线程池的原理及实现

线程池的用法及思考

线程池的使用场景和代码实现!

深入理解 Java 线程池的实现原理