线程池三个常用方法(底层实现ThreadPoolExecutor)

 1 import java.util.concurrent.*;
 2 
 3 /**
 4  * 第四种获取线程的方式:线程池
 5  * 底层为实现为ThreadPoolExecutor类
 6  * 线程池做的工作主要是控制运行线程的数量,处理过程种将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量的线程排队等候,等其它线程执行完毕,再从队列中取出任务来执行。
 7  * 他的主要特点为:线程复用:控制最大并发数:线程管理。
 8  * 第一:降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
 9  * 第二:提高响应速度,当任务到达时,任务可以不需要的等到线程创建就能立即执行
10  * 第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和控制
11  *
12  */
13 public class MyThreadPoolDemo {
14 
15     public static void main(String[] args) {
16 
17         //生产上的调用
18         ExecutorService threadPool=new ThreadPoolExecutor(
19                 2,
20                 5,
21                 1L,
22                 TimeUnit.SECONDS,
23                 new LinkedBlockingQueue<>(3),
24                 Executors.defaultThreadFactory(),
25                 /*new ThreadPoolExecutor.AbortPolicy()*/
26                 /*new ThreadPoolExecutor.CallerRunsPolicy()*/
27                 /*new ThreadPoolExecutor.DiscardOldestPolicy()*/
28                 new ThreadPoolExecutor.DiscardPolicy());
29         try {
30             for (int i = 1; i <10 ; i++) {
31                 threadPool.execute(()->{
32                     System.out.println(Thread.currentThread().getName()+"\t 执行业务");
33                 });
34                 //try {TimeUnit.MICROSECONDS.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}
35             }
36         }catch (Exception e){
37             e.printStackTrace();
38         }finally {
39             threadPool.shutdown();
40         }
41     }
42 
43     //学习上的调用
44     private static void executorsTest() {
45         //ExecutorService threadPool = Executors.newFixedThreadPool(5);//一个池5个线程
46         //ExecutorService threadPool = Executors.newSingleThreadExecutor();//一个池1个线程
47         ExecutorService threadPool = Executors.newCachedThreadPool();//一个池N个线程
48         //模拟10个用户来办理业务,每个用户就是一个自外部的请求线程
49 
50         try {
51             for (int i = 1; i <10 ; i++) {
52                 threadPool.execute(()->{
53                     System.out.println(Thread.currentThread().getName()+"\t 执行业务");
54                 });
55                 try {
56                     TimeUnit.MICROSECONDS.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}
57             }
58         }catch (Exception e){
59             e.printStackTrace();
60         }finally {
61             threadPool.shutdown();
62         }
63     }
64 }

 

posted @ 2021-05-13 10:44  ffzzblog  阅读(306)  评论(0)    收藏  举报