线程池七大参数介绍!手写线程池

1.corePoolSize:线程池中的常驻核心线程数。

(1).在创建了线程池后,当有请求任务来了之后,就会安排池中线程去执行请求任务,近似理解为今日当值线程。
(2). 在线程池中的线程数目达到corePoolSize后,就会把后续到达的任务放到缓存队列中。

2.maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值必须大于等于1。

3.keepAliveTime:多余的空闲线程的存活时间。当前线程池数量超过corePoolSize时,当空闲时间到达keepAliveTime值时,多余空闲线程会被销毁直到剩下corePoolSize个线程为止。

(1).默认情况下:只有当线程池中的线程数大于corePoolSize时keepAliveTime才会起作用,直到线程池中的线程数不大于corePoolSize。

4.unit:keepAliveTime的单位。

5.workQueue:任务队列,被提交但尚未被执行的任务。

6.threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程一般默用即可。

7.handler:拒绝策略,表示当dui队列满了并且工作线程大于等于线程池的最大线程数(maximumPoolSize)。

(1).拒绝策略是什么?等待队列也已经满了,再也塞不下新任务了,同时,线程池中的max线程也达到了,无法继续为新任务服务。这时候我们就需要拒绝策略机制合理的处理这个问题。

手写线程池:

public class MyThreadPoolDemo {
    public static void main(String[] args) {
        System.out.println(Runtime.getRuntime().availableProcessors());

        ExecutorService threadPool = new ThreadPoolExecutor(
                2, //corePoolSize
                5,//maximumPoolSize
                1L,//keepAliveTime
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );

     try
    {
        //模拟10个用户来办理业务,每个用户就是来自外部的请求线程
        for (int i = 1; i <= 10; i++) {

            threadPool.execute(() -> {
                System.out.println(Thread.currentThread().getName() + "\t 办理业务");
            });
        }
    }catch (Exception e){
        e.printStackTrace();
    }finally{
        threadPool.shutdown();
    }
}}

运行结果:当10位用户来办理时,会出现异常。如图:因为最大线程数为5,阻塞队列为3,所以只要大于8个用户同时请求,就会抛出异常
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
手写一个简单的Java线程池时,你可以按照以下步骤进行: 1. 首先,你需要创建一个实现了Runnable接口的任务类。这个任务类将代表线程池中的每个任务。 ```java public class Task implements Runnable { @Override public void run() { // 任务执行的逻辑代码 } } ``` 2. 接下来,你需要创建一个线程池类,并初始化线程池的大小和其他相关参数。 ```java public class ThreadPool { private final int poolSize; private final List<Thread> threads; private final BlockingQueue<Runnable> taskQueue; public ThreadPool(int poolSize) { this.poolSize = poolSize; this.threads = new ArrayList<>(); this.taskQueue = new LinkedBlockingQueue<>(); } public void submit(Runnable task) { taskQueue.offer(task); } public void start() { for (int i = 0; i < poolSize; i++) { Thread thread = new Thread(() -> { while (true) { try { Runnable task = taskQueue.take(); task.run(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }); threads.add(thread); thread.start(); } } public void shutdown() { for (Thread thread : threads) { thread.interrupt(); } } } ``` 3. 最后,你可以使用线程池类来提交任务并启动线程池。 ```java public class Main { public static void main(String[] args) { ThreadPool threadPool = new ThreadPool(5); threadPool.start(); for (int i = 0; i < 10; i++) { threadPool.submit(new Task()); } // 关闭线程池 threadPool.shutdown(); } } ``` 这是一个简单的手写Java线程池的示例,但请注意,这个线程池的实现只是一个基本的框架,你可以根据自己的需求进行更复杂的优化和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值