线程池创建的核心:
三大方法:
1.Executors.newSingleThreadExecutor();
2.Executors.newFixedThreadPool(5);
3.Executors.newCachedThreadPool();
七大参数:(自定义创建线程池)
1.核心线程数
2.最大线程数
3.等待时间
4.等待时间单位
5.阻塞队列
6.线程池创建工场
7.拒绝策略
四大拒绝策略:
AbortPolicy; 队列和线程池满了之和就会抛出异常
CallerRunsPolicy; 哪来的回哪里去
DiscardOldestPolicy; 满了之后不会抛出异常,丢掉任务
DiscardPolicy 满了之后尝试竞争第一个,失败也不抛异常
线程池最大值如何设置:
1.CPU密集型
System.out.println(Runtime.getRuntime().availableProcessors());
获得cpu的核数,不同的硬件不一样
2.IO密集型
大型的程序任务有多少个? IO非常消耗资源
线程池最大值 > 大型任务的数量即可
一般设置大型任务的数量*2
package cn.pw.demo01; import java.util.concurrent.*; /* 线程池创建的核心: * 三大方法: * 1.Executors.newSingleThreadExecutor(); * 2.Executors.newFixedThreadPool(5); * 3.Executors.newCachedThreadPool(); * 七大参数:(自定义创建线程池) * 1.核心线程数 * 2.最大线程数 * 3.等待时间 * 4.等待时间单位 * 5.阻塞队列 * 6.线程池创建工场 * 7.拒绝策略 * 四大拒绝策略: * AbortPolicy; 队列和线程池满了之和就会抛出异常 CallerRunsPolicy; 哪来的回哪里去 DiscardOldestPolicy; 满了之后不会抛出异常,丢掉任务 DiscardPolicy 满了之后尝试竞争第一个,失败也不抛异常 * 线程池最大值如何设置: * 1.CPU密集型 * System.out.println(Runtime.getRuntime().availableProcessors()); * 获得cpu的核数,不同的硬件不一样 * 2.IO密集型 * 大型的程序任务有多少个? IO非常消耗资源 * 线程池最大值 > 大型任务的数量即可 * 一般设置大型任务的数量*2 * * * */ public class Test07ThreadPool { public static void main(String[] args) { //单线程池 // ExecutorService threadPool = Executors.newSingleThreadExecutor(); //创建一个线程池中可以有5条线程 // ExecutorService threadPool = Executors.newFixedThreadPool(5); //缓存线程池,不固定大小 // ExecutorService threadPool = Executors.newCachedThreadPool(); // try { // for (int i = 0; i < 50; i++) { // threadPool.execute(()->{ // System.out.println(Thread.currentThread().getName()+"ok"); // }); // } // } catch (Exception e) { // e.printStackTrace(); // } finally { // //关闭线程池 // threadPool.shutdown(); // } //源生的线程池创建 // public ThreadPoolExecutor(int corePoolSize,//核心线程数 // int maximumPoolSize, //最大线程数 // long keepAliveTime, //空闲线程的等待时间 // TimeUnit unit, //时间单位 // BlockingQueue<Runnable> workQueue //线程队列 ) { // this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, // Executors.defaultThreadFactory(), defaultHandler); // } // 四种拒绝策列 // AbortPolicy; 队列和线程池满了之和就会抛出异常 // CallerRunsPolicy; 哪来的回哪里去 // DiscardOldestPolicy; 满了之后不会抛出异常,丢掉任务 // DiscardPolicy 满了之后尝试竞争第一个,失败也不抛异常 ThreadPoolExecutor threadPool= new ThreadPoolExecutor( 2,//核心线程数 Runtime.getRuntime().availableProcessors(),//最大线程数 3,//等待时间 TimeUnit.SECONDS,//时间单位 new LinkedBlockingQueue<>(3),//等待队列 Executors.defaultThreadFactory(),//默认线程工场,一般不改变 new ThreadPoolExecutor.DiscardOldestPolicy()//线程和队列满了的拒绝策列 ); try { //线程池大小= 最大线程数+ 阻塞队列大小 for (int i = 1; i <= 9; i++) { threadPool.execute(()->{ System.out.println(Thread.currentThread().getName()+"ok"); }); } } catch (Exception e) { e.printStackTrace(); } finally { //关闭线程池 threadPool.shutdown(); } } }