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 }