这里提供一个简单的基于Spring的线程池实现示例,可以根据实际需求进行调整。

  1. 配置文件applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/aop 
       http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/tx 
       http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/task
       http://www.springframework.org/schema/task/spring-task.xsd">
       
    <!-- 线程池配置 -->
    <task:executor id="threadPool" pool-size="50-200" queue-capacity="1000" rejection-policy="CALLER_RUNS"/>
    
    <!-- 任务调度器配置 -->
    <task:scheduler id="scheduler" pool-size="10"/>
    
</beans>
  1. 编写测试类
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.task.TaskExecutor;

public class ThreadPoolTest {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        TaskExecutor taskExecutor = (TaskExecutor) context.getBean("threadPool");

        // 模拟高并发请求,提交1000个任务
        for (int i = 0; i < 1000; i++) {
            final int taskId = i;
            taskExecutor.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println("任务" + taskId + "开始执行...");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("任务" + taskId + "执行完成。");
                }
            });
        }
    }
}
  1. 运行测试类,观察控制台输出。可以看到线程池成功地处理了1000个任务,并且未出现OOM等异常。

具体说明:

  • 线程池的核心线程数为50,最大线程数为200,任务队列的容量为1000。当任务数量超过核心线程数时,会先创建新线程,当线程池中的线程数量达到最大线程数时,新任务会进入队列等待执行,如果队列已满,则根据拒绝策略进行处理。
  • 任务调度器的线程池大小为10,用于定时任务等场景。如果不需要定时任务,则可以省略此配置。
  • 在运行测试类时,如果控制台输出过于频繁,可以将Thread.sleep的时间调整为较大值,以减少输出量。

原文地址: https://www.cveoy.top/t/topic/PX3 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录