Java线程池的创建及其他知识

Java线程池的三大方法、七大参数、四种拒绝策略

三大方法:

//用于创建线程(不安全)
ExecutorService executor = Executors.newSingleThreadExecutor();   //单个线程
ExecutorService executor = Executors.newFixedThreadPool(5);       //固定数量
ExecutorService executor = Executors.newCachedThreadPool();       //遇强则强

七大参数:

//用于自定义创建线程的参数
int corePoolSize                         //核心线程池大小
int maximumPoolSize                      //最大核心线程池大小
long keepAliveTime                       //超时了没有人调用就会释放
TimeUnit unit                            //超时单位
BlockingQueue<Runnable> workQueue        //阻塞队列
ThreadFactory threadFactory              //线程工厂,创建线程的,一般不动
RejectedExecutionHandler handler         //拒绝策略

四种拒绝策略:

//用于线程太多无法处理解决的策略
new ThreadPoolExecutor.AbortPolicy()             //不处理,直接抛异常;
new ThreadPoolExecutor.CallerRunsPolicy()        //哪来的交给谁处理去;
new ThreadPoolExecutor.DiscardPolicy()           //丢掉,不抛异常;
new ThreadPoolExecutor.DiscardOldestPolicy()     //先来后到,尝试竞争 不抛异常;

模拟银行办业务功能:

/**
* 需求:
* 1、银行默认开启两台服务机器
* 2、一共有n台机器(根据自己电脑的cpu选择)
* 3、如果服务机器五秒内没有人使用则关闭此服务机器
* 4、候客室有三个座位
*/
public static void main(String[] args) {

    //获取电脑的cpu核数
    int cpu = Runtime.getRuntime().availableProcessors();

     //自定义创建线程池,推荐使用,并不是上面的三种创建方式;那种方式不安全...
     ThreadPoolExecutor executor = new ThreadPoolExecutor(
             2,  //默认开两台服务机器
             cpu,  //最多几台机器
             5,  //超过这个时间如果服务机器没有使用,则会关闭服务
             TimeUnit.SECONDS,   //时间单位
             new ArrayBlockingQueue<>(3),    //候客室(队列)
             Executors.defaultThreadFactory(),   //线程工厂默认
             new ThreadPoolExecutor.AbortPolicy()    //四种拒绝策略
     );

     try {
         //(int i)超过线程最大数量+队列数量;则会报错java.util.concurrent.RejectedExecutionException
         for (int i = 1; i <= cpu; i++) {
             executor.execute(() -> {
                 try {
                     System.out.println(Thread.currentThread().getName());
                     TimeUnit.SECONDS.sleep(3);
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
             });
         }
     } catch (Exception e) {
         e.printStackTrace();
     } finally {
         executor.shutdown();
     }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值