时间:2021-05-20
线程池中,常见有涉及到的:
ExecutorService executorService = Executors.newSingleThreadExecutor();
ExecutorService executorService1 = Executors.newCachedThreadPool();
ExecutorService executorService2 = Executors.newFixedThreadPool(3);
关于Executors和ExecutorService从记忆上类似于Collections和List。
但是以上几种其实不建议使用。最好可以通过自己手动配置ThreadPoolExecutor的形式。
我先创建一个demo:
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( 2, 5, 1L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy() );涉及7个参数,按顺序分别是
int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler具体我首先需要结合参数解释下线程池的执行原理:
画了张图:
如果我用银行办理业务示例说明如下:
1、首先银行里面有两个柜台,这就是核心线程数(7大参数之一)。
2、然后随着客户的增加,可能这个两个柜台满了,然后就要请用户到等候区里面进行等待。这个等候区就是相当于阻塞队列(七大参数之一)。
3、然后紧接着客户越来越多,连阻塞队列都撑不住了,这个时候,就要请求,上面的领导进行多增加柜台的操作,这个时候,可能加了三个柜台,现在就有5个柜台了。这个时候最大的线程数(七大参数之一)就是5了。
4、但是这个时候可能客户又越来越多,这个时候新加的柜台也受不了,就要开始有拒绝策略了(七大参数之一)
5、然后过了一段时间,慢慢的,客户越来越少了,这个时候,发现渐渐的,柜台空余出来了。KeepAliveTime(七大参数之一,加上单位,合计两个参数)指当线程数大于核心线程数时,此为终止前多余的空闲线程等待新任务的最长时间。
6、还有一个参数是工厂,这个我们不做深入研究,直接用默认的工厂即可。
懂得原理以后,我们可以查看下,为什么最好不要直接用,比如:
Executors.newFixedThreadPool(3);
这个的主要原因就是这里面默认队列的最大值是Integer的最大值。
所以我们生产中需要自己配置线程池。因为默认队列的长度太长了,有可能会导致oom。就是内存炸掉了。
这个在阿里的编程思想里面也有说明这一点:
这边我们探讨下,拒绝策略。4种策略。就是所有柜台和等候区全部满了。会如何处理。
用非常easy的代码来过下,这块的内容:
1、AbortPolicy
import java.util.concurrent.*;public class VolatileTest { public static void main(String[] args) throws Exception { ExecutorService executorService = new ThreadPoolExecutor( 2, 5, 1L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy() ); try { for (int i = 0; i < 9; i++) { executorService.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()+"\t"+"办理业务"); } }); } } catch (Exception e) { e.printStackTrace(); } finally { } }}可以看到如果超出的话直接挂了,阻止正常运行。
2、CallerRunsPolicy
输出
发现有一个退回main线程,被main线程处理。即会把任务退回至调用者。
3、DiscardOldestPolicy
这个将会等待时间最久的任务丢掉。
4、DiscardPolicy
多出来的任务会全部丢掉。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
详解Java线程池和Executor原理的分析线程池作用与基本知识在开始之前,我们先来讨论下“线程池”这个概念。“线程池”,顾名思义就是一个线程缓存。它是一个或
从Java5开始,Java提供了自己的线程池。线程池就是一个线程的容器,每次只执行额定数量的线程。java.util.concurrent.ThreadPool
Java线程池ExecutorService1.线程池 1.1什么情况下使用线程池单个任务处理的时间比较短.将需处理的任务的数量大.1.2使用线程池的好处减少在
Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程
之前我们介绍了线程池的四种拒绝策略,了解了线程池参数的含义,那么今天我们来聊聊Java中常见的几种线程池,以及在jdk7加入的ForkJoin新型线程池首先我们