Tomcat 请求处理分析和Java线程池构成分析____写线程池ThreadPoolExecutor(7个参数)/四种拒绝策略/线程池工厂改名

本文详细解析了如何创建和配置Java线程池,包括核心线程数、最大线程数、线程空闲时间、任务队列、拒绝策略和线程工厂等关键参数。通过示例代码展示了ThreadPoolExecutor的使用,并演示了任务提交和执行的过程。
摘要由CSDN通过智能技术生成

Tomcat 请求处理分析

在这里插入图片描述

Java线程池构成分析

在这里插入图片描述

package com.jt.thread;

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicLong;

public class ThreadPoolTests {
    public static void main(String[] args) {
    //1.核心线程数
    int corePoolSize = 2;
    //2.最大线程数
    int maximumPoolSize = 3;
    //3.线程最大空闲时间
    long keepAliveTime = 60;
    //4.时间单位
    TimeUnit unit = TimeUnit.SECONDS;
    //5.任务队列(阻塞式队列)
    BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(1);
    //6.定义拒绝策略(可选,常用有四种 这里是主线程调用策略 还有默认的AbortPolicy中断策略并抛出个异常,DiscardPolicy丢弃策略不抛出异常,DiscardOldestPolicy弃老策略:丢弃队列最前面的任务)
    RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy();
    //7.构建线程工厂(可选,最关键是要给线程一个友好的名字)
    ThreadFactory factory = new ThreadFactory() {
        //线程名前缀
        private String namePrefix = "cgb2105-Thread-";
        //构建一个线程安全的原子自增自减对象
        private AtomicLong atomicLong = new AtomicLong(1);
        @Override
        public Thread newThread(Runnable r) {   //r 为任务
            return new Thread(r,namePrefix+atomicLong.getAndIncrement());
        }
    };
    //8.创建线程池
    ThreadPoolExecutor pool = new ThreadPoolExecutor
            (corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,factory,handler);
    //9.将任务交给池中对象去执行
    pool.execute(new Runnable() {
        @Override
        public void run() {
            String tName=
                    Thread.currentThread().getName();
            System.out.println(tName+"->任务1");
            try{Thread.sleep(5000);}catch (Exception e){}
        }
    });
        pool.execute(new Runnable() {
            @Override
            public void run() {
                String tName=
                        Thread.currentThread().getName();
                System.out.println(tName+"->任务2");
                try{Thread.sleep(5000);}catch (Exception e){}
            }
        });
        pool.execute(new Runnable() {
            @Override
            public void run() {
                String tName=
                        Thread.currentThread().getName();
                System.out.println(tName+"->任务3");
                try{Thread.sleep(5000);}catch (Exception e){}
            }
        });
        pool.execute(new Runnable() {
            @Override
            public void run() {
                String tName=
                        Thread.currentThread().getName();
                System.out.println(tName+"->任务4");
                try{Thread.sleep(5000);}catch (Exception e){}
            }
        });
        pool.execute(new Runnable() {
            @Override
            public void run() {
                String tName=
                        Thread.currentThread().getName();
                System.out.println(tName+"->任务5");
            }
        });
        pool.shutdown();//不再接收任务,等现有任务执行结束将池关掉
        // pool.shutdownNow();//不再接收任务,但有可能会将现有任务也会停止


    }
}

Java线程池是一种用于管理和复用线程的机制,它可以帮助我们更好地管理线程,防止线程过多导致系统资源的浪费和性能问题。线程池通过一个池子来缓存和复用线程,让线程可以被重复利用,从而减少线程的创建和销毁的开销,提高系统的性能。 在Java中,线程池是通过java.util.concurrent包下面的Executor框架来实现的。Executor框架提供了一种将任务提交与执行分离开来的机制,它将任务的提交和执行分离开来,从而使得任务的执行更加高效和灵活。 Java线程池的主要特点包括: 1. 线程复用:线程池中的线程可以被重复利用,从而减少线程的创建和销毁的开销,提高系统的性能。 2. 控制线程数量:通过控制线程池中的线程数量,可以避免线程过多导致系统资源的浪费和性能问题。 3. 线程池大小自适应:线程池的大小可以根据需要自适应调整,以适应不同的任务负载。 4. 任务队列线程池中通常会设置一个任务队列,用于存放等待执行的任务。 5. 线程池管理:线程池通常会提供一些管理方法,用于监控线程池的状态和执行情况。 Java线程池的使用步骤如下: 1. 创建一个线程池对象。 2. 向线程池中提交任务。 3. 线程池会自动分配线程来执行任务。 4. 等待任务执行完成。 5. 关闭线程池线程池的具体实现可以通过Java提供的ThreadPoolExecutor类来完成。ThreadPoolExecutor类提供了一些构造方法和方法,可以用来设置线程池参数和管理线程池。同时,Java还提供了一些其他类型的线程池,例如FixedThreadPool、CachedThreadPool和ScheduledThreadPool等,可以根据需要选择不同类型的线程池处理任务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值