@@ -450,6 +450,67 @@ public interface Callable<V> {
450
450
对应Executors工具类中的方法如图所示:
451
451
![ Executor框架的工具类] ( https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/Executor框架的工具类.png )
452
452
453
+ ### 4.5 ThreadPoolExecutor 类分析
454
+
455
+ ` ThreadPoolExecutor ` 类中提供的四个构造方法。我们来看最长的那个,其余三个都是在这个构造方法的基础上产生(其他几个构造方法说白点都是给定某些默认参数的构造方法比如默认制定拒绝策略是什么),这里就不贴代码讲了,比较简单。
456
+
457
+ ``` java
458
+ /**
459
+ * 用给定的初始参数创建一个新的ThreadPoolExecutor。
460
+ */
461
+ public ThreadPoolExecutor(int corePoolSize,
462
+ int maximumPoolSize,
463
+ long keepAliveTime,
464
+ TimeUnit unit,
465
+ BlockingQueue<Runnable > workQueue,
466
+ ThreadFactory threadFactory,
467
+ RejectedExecutionHandler handler) {
468
+ if (corePoolSize < 0 ||
469
+ maximumPoolSize <= 0 ||
470
+ maximumPoolSize < corePoolSize ||
471
+ keepAliveTime < 0 )
472
+ throw new IllegalArgumentException ();
473
+ if (workQueue == null || threadFactory == null || handler == null )
474
+ throw new NullPointerException ();
475
+ this . corePoolSize = corePoolSize;
476
+ this . maximumPoolSize = maximumPoolSize;
477
+ this . workQueue = workQueue;
478
+ this . keepAliveTime = unit. toNanos(keepAliveTime);
479
+ this . threadFactory = threadFactory;
480
+ this . handler = handler;
481
+ }
482
+ ```
483
+
484
+ ** 下面这些对创建 非常重要,在后面使用线程池的过程中你一定会用到!所以,务必拿着小本本记清楚。**
485
+
486
+ #### 4.5.1 ` ThreadPoolExecutor ` 构造函数重要参数分析
487
+
488
+ ** ` ThreadPoolExecutor ` 3 个最重要的参数:**
489
+
490
+ - ** ` corePoolSize ` :** 核心线程数线程数定义了最小可以同时运行的线程数量。
491
+ - ** ` maximumPoolSize ` :** 当队列中存放的任务达到队列容量的时候,当前可以同时运行的线程数量变为最大线程数。
492
+ - ** ` workQueue ` :** 当新任务来的时候会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,信任就会被存放在队列中。
493
+
494
+ ` ThreadPoolExecutor ` 其他常见参数:
495
+
496
+ 1 . ** ` keepAliveTime ` ** :当线程池中的线程数量大于 ` corePoolSize ` 的时候,如果这时没有新的任务提交,核心线程外的线程不会立即销毁,而是会等待,直到等待的时间超过了 ` keepAliveTime ` 才会被回收销毁;
497
+ 2 . ** ` unit ` ** : ` keepAliveTime ` 参数的时间单位。
498
+ 3 . ** ` threadFactory ` ** : executor 创建新线程的时候会用到。
499
+ 4 . ** ` handler ` ** :饱和策略。关于饱和策略下面单独介绍一下。
500
+
501
+ #### 4.5.2 ` ThreadPoolExecutor ` 饱和策略
502
+
503
+ ** ` ThreadPoolExecutor ` 饱和策略定义:**
504
+
505
+ 如果当前同时运行的线程数量达到最大线程数量并且队列也已经被放满了任时,` ThreadPoolTaskExecutor ` 定义一些策略:
506
+
507
+ - ** ` ThreadPoolExecutor.AbortPolicy ` ** :抛出 ` RejectedExecutionException ` 来拒绝新任务的处理。
508
+ - ** ` ThreadPoolExecutor.CallerRunsPolicy ` ** :调用执行自己的线程运行任务。您不会任务请求。但是这种策略会降低对于新任务提交速度,影响程序的整体性能。另外,这个策略喜欢增加队列容量。如果您的应用程序可以承受此延迟并且你不能任务丢弃任何一个任务请求的话,你可以选择这个策略。
509
+ - ** ` ThreadPoolExecutor.DiscardPolicy ` :** 不处理新任务,直接丢弃掉。
510
+ - ** ` ThreadPoolExecutor.DiscardOldestPolicy ` :** 此策略将丢弃最早的未处理的任务请求。
511
+
512
+ 举个例子: Spring 通过 ` ThreadPoolTaskExecutor ` 或者我们直接通过 ` ThreadPoolExecutor ` 的构造函数创建线程池的时候,当我们不指定 ` RejectedExecutionHandler ` 饱和策略的话来配置线程池的时候默认使用的是 ` ThreadPoolExecutor.AbortPolicy ` 。在默认情况下,` ThreadPoolExecutor ` 将抛出 ` RejectedExecutionException ` 来拒绝新来的任务 ,这代表你将丢失对这个任务的处理。 对于可伸缩的应用程序,建议使用 ` ThreadPoolExecutor.CallerRunsPolicy ` 。当最大池被填满时,此策略为我们提供可伸缩队列。(这个直接查看 ` ThreadPoolExecutor ` 的构造函数源码就可以看出,比较简单的原因,这里就不贴代码了。)
513
+
453
514
## 5. Atomic 原子类
454
515
455
516
### 5.1. 介绍一下Atomic 原子类
0 commit comments