ThreadPoolExecutor线程池的使用及原理(一篇就够)

线程池原理:
在这里插入图片描述

package com.cy.java.api.thread;

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
//JUC

public class ThreadPoolTests {
    public static void main(String[] args) {
    
    	//核心线程,核心线程满了,放入队列,队列满了开启再新线程。
        int corePoolSize=2;
        
        //最大线程数(核心线程+新线程),最大线程数、队列数都满了,默认抛异常
        int maximumPoolSize=3;
        
        //线程池中空闲线程等待工作的超时时间
        int keepAliveTime=60;
        
        //时间颗粒度转换(例如keepAliveTime默认单位为毫秒,转换成秒)
        TimeUnit unit=TimeUnit.SECONDS;
        
        //任务队列,存储要执行的任务,最大队列数设为1
        BlockingQueue<Runnable> workQueue=new ArrayBlockingQueue<>(1);
        
        //定义执行器
        RejectedExecutionHandler handler=
        //new ThreadPoolExecutor.AbortPolicy();//不能执行任务时,抛出异常
          new ThreadPoolExecutor.CallerRunsPolicy();//由调用者去执行

        //创建线程的工厂
        ThreadFactory threadFactory=new ThreadFactory() {
        	//定义线程名
            private String prefix="db-service-thread-";
            //生成自增长数
            private AtomicInteger atomicInteger=new AtomicInteger(0);
            @Override
            public Thread newThread(Runnable task) {
                return new Thread(task,prefix+atomicInteger.incrementAndGet());
            }
        };

          
        //构建线程池对象
        ThreadPoolExecutor threadPool= new ThreadPoolExecutor(
                        corePoolSize,
                        maximumPoolSize,
                        keepAliveTime,
                        unit,
                        workQueue,
                        threadFactory,
                        handler);


//设置休眠时间测试允许结果。核心线程数2,最大线程树3,最大队列1,超出最大限线程数时,由调用者去执行。
        threadPool.execute(new Runnable() {//task
            @Override
            public void run() {
                String tName=Thread.currentThread().getName();
                System.out.println(tName+"->execute->task1");
                try{Thread.sleep(5000);}catch (Exception e){}
            }
        });
        threadPool.execute(new Runnable() {//task
            @Override
            public void run() {
                String tName=Thread.currentThread().getName();
                System.out.println(tName+"->execute->task2");
                try{Thread.sleep(5000);}catch (Exception e){}
            }
        });
        threadPool.execute(new Runnable() {//task
            @Override
            public void run() {
                String tName=Thread.currentThread().getName();
                System.out.println(tName+"->execute->task3");
            }
        });
        threadPool.execute(new Runnable() {//task
            @Override
            public void run() {
                String tName=Thread.currentThread().getName();
                System.out.println(tName+"->execute->task4");
                try{Thread.sleep(5000);}catch (Exception e){}
            }
        });
        threadPool.execute(new Runnable() {//task
            @Override
            public void run() {
                String tName=Thread.currentThread().getName();
                System.out.println(tName+"->execute->task5");
                try{Thread.sleep(5000);}catch (Exception e){}
            }
        });

    }
}

/*运行结果:
db-service-thread-1->execute->task1
db-service-thread-2->execute->task2
db-service-thread-3->execute->task4
main->execute->task5
db-service-thread-2->execute->task3
*/

线程溢出时出错:
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值