这里提供一个简单的基于 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 的时间调整为较大值,以减少输出量。

最佳实践:

  • 针对 4 核 8G 服务器,可以根据实际情况调整线程池参数。例如,将核心线程数设置为 4,最大线程数设置为 8,任务队列容量设置为 1024。
  • 可以根据应用的特性选择合适的拒绝策略,例如 CallerRunsPolicy 可以将任务提交到调用线程执行,避免线程池过载。
  • 定期监控线程池的运行状态,例如线程池大小、任务队列大小、拒绝任务数等,以便及时调整参数或排查问题。

注意:

  • 线程池的配置需要根据实际应用场景进行调整,例如任务的执行时间、资源消耗等。
  • 为了避免线程池过度占用系统资源,需要合理设置线程池参数。
  • 定期监控线程池的运行状态,并根据需要进行调整。

相关资源:

Java Spring 线程池实现:高并发、高吞吐量,4 核 8G 服务器优化

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

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