核心线程数和最大线程数的区别

首先看下来自实测的效果图

 

 

首先看核心线程够不够用,不够用的话线程数变成了最大线程数的设置,最后队列已经被任务占满了,抛出异常

首先使用核心线程

然后采用最大线程

 以上就是核心线程数和最大线程数的区别

代码部分

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.8</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.web</groupId>
    <artifactId>web-study</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>web-study</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--ThreadFactoryBuilder的依赖包,多线程使用-->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>30.1-jre</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>
View Code
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.web.webstudy.test;
 
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;
 
/**
 * @Description:
 * @Author: Yourheart
 * @Create: 2023/2/10 17:21
 */
public class CustomThreadFactory implements ThreadFactory {
 
 
    private static final AtomicInteger poolNumber = new AtomicInteger(1);
    private final ThreadGroup group;
    private final AtomicInteger threadNumber = new AtomicInteger(1);
    private final String namePrefix;
 
    public CustomThreadFactory() {
        SecurityManager s = System.getSecurityManager();
        group = (s != null) ? s.getThreadGroup() :
                Thread.currentThread().getThreadGroup();
        namePrefix = "线程池数量-" +
                poolNumber.getAndIncrement() +
                "-线程名称-";
    }
 
    @Override
    public Thread newThread(Runnable r) {
        Thread t = new Thread(group, r,
                namePrefix + threadNumber.getAndIncrement() + "",
                0);
        if (t.isDaemon()){
            t.setDaemon(false);
        }
        if (t.getPriority() != Thread.NORM_PRIORITY){
            t.setPriority(Thread.NORM_PRIORITY);
        }
 
        return t;
    }
 
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.web.webstudy;
 
import com.web.webstudy.test.CustomThreadFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
 
import java.util.concurrent.*;
 
/**
 * @Description: 自定义线程池
 * @Author: Yourheart
 * @Create: 2023/2/9 10:38
 */
@Component
public class ThreadPool {
 
    @Bean
    public ThreadPoolExecutor threadPoolExecutor() {
        //核心线程数
        int corePoolSize = 2;
        //最大线程数
        int maximumPoolSize = 5;
        //超过 corePoolSize 线程数量的线程最大空闲时间
        long keepAliveTime = 0;
        //以秒为时间单位
        TimeUnit unit = TimeUnit.SECONDS;
        //创建工作队列,用于存放提交的等待执行任务
        BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>(10);
        ThreadFactory threadFactory = new CustomThreadFactory();
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize,
                maximumPoolSize,
                keepAliveTime,
                unit,
                workQueue,
                threadFactory,
                new ThreadPoolExecutor.AbortPolicy());
        return threadPoolExecutor;
 
    }
 
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.web.webstudy;
 
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import java.util.concurrent.ThreadPoolExecutor;
 
/**
 * @Description:
 * @Author: Yourheart
 * @Create: 2023/2/9 10:44
 */
@RestController
@Slf4j
public class ThreadPoolController {
 
    @Autowired
    private  ThreadPoolExecutor threadPoolExecutor;
 
    @RequestMapping("/test")
    public String test(int threadPoolNum,int threadNum){
 
        for (int i=0;i<threadPoolNum;i++){
 
            for (int k=0;k<threadNum;k++){
                threadPoolExecutor.execute(new ThreadPoolTest(k));
            }
        }
        return "success";
 
    }
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.web.webstudy;
 
import lombok.extern.slf4j.Slf4j;
 
/**
 * @Description:
 * @Author: Yourheart
 * @Create: 2023/2/9 10:43
 */
@Slf4j
public class ThreadPoolTest implements Runnable {
 
 
    private int count;
 
    public ThreadPoolTest(int count) {
        this.count = count;
    }
 
    @Override
    public void run() {
 
        String name = Thread.currentThread().getName();
        log.info("线程名称:{},count:{}",name,count);
 
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
 
 
    }
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.web.webstudy;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
public class WebStudyApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(WebStudyApplication.class, args);
    }
 
}

  我这边采用的接口调用的方式进行的测试的

接口地址 http://127.0.0.1:8080/test?threadPoolNum=1&threadNum=10

 

posted @   不忘初心2021  阅读(581)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示