ThreadPoolTaskExecutor多線程使用,及線程池配置

1.配置 ThreadPoolTaskExecutor beanjava

<?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:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    
    <!-- 掃描註解 -->
    <context:component-scan base-package="com.qi.quartz">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>
    
    <bean id="taskExecutor" name="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">  
        <!-- 核心線程數 線程池維護線程的最少數量 -->
        <property name="corePoolSize" value="10" />  
        <!-- 線程池維護線程所容許的空閒時間 -->
        <property name="keepAliveSeconds" value="200" />  
        <!-- 線程池維護線程的最大數量 -->
        <property name="maxPoolSize" value="20" />  
        <!-- 線程池所使用的緩衝隊列 -->
        <property name="queueCapacity" value="100" /> 
        <!-- 線程池對拒絕任務(無線程可用)的處理策略 ThreadPoolExecutor.CallerRunsPolicy策略 ,調用者的線程會執行該任務,若是執行器已關閉,則丟棄.  -->
        <property name="rejectedExecutionHandler">
            <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
        </property> 
    </bean>  
    
</beans>

2.controller使用web

package com.qi.quartz.web;

import javax.annotation.Resource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/test")
public class ThreadPoolExcuteController {
    
    Logger LOG = LoggerFactory.getLogger(ThreadPoolExcuteController.class);
    
    @Resource(name = "taskExecutor")
    private ThreadPoolTaskExecutor taskExecutor;

    @RequestMapping("/execute")
    @ResponseBody
    public void execute(){
        taskExecutor.execute(new Runnable(){

            public void run() {
                try {
                    LOG.info("執行線程任務開始前");
                    Thread.currentThread().sleep(10000);
                    if (LOG.isDebugEnabled()) {
                        LOG.info("執行線程任務結束");
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            
        });
    }

}

3.使用 apache ab 併發測試spring

/usr/local/apache2/bin/ab -n 1000 -c 1000 http://192.168.8.101:8080/QuartzDemo/test/executeexpress

Benchmarking 192.168.8.101 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requestsapache


Server Software: Apache-Coyote/1.1
Server Hostname: 192.168.8.101
Server Port: 8080併發

Document Path: /QuartzDemo/test/execute
Document Length: 3 bytesapp

Concurrency Level: 1000
Time taken for tests: 41.982 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 163000 bytes
HTML transferred: 3000 bytes
Requests per second: 23.82 [#/sec] (mean)
Time per request: 41982.345 [ms] (mean)
Time per request: 41.982 [ms] (mean, across all concurrent requests)
Transfer rate: 3.79 [Kbytes/sec] received測試

Connection Times (ms)
min mean[+/-sd] median max
Connect: 1 304 211.4 291 1077
Processing: 172 22968 13412.1 21237 41240
Waiting: 161 22900 13455.0 21174 41171
Total: 472 23272 13441.8 21505 41944spa

Percentage of the requests served within a certain time (ms)
50% 21505
66% 31398
75% 31725
80% 40963
90% 41467
95% 41605
98% 41930
99% 41939
100% 41944 (longest request)線程

 

咱們配置的核心處理10個線程,最大20個,緩衝隊列100,總耗時41.982,隨着咱們更改這些配置的時候,處理的狀況就不一樣了。

 

更改配置爲

<?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:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    
    <!-- 掃描註解 -->
    <context:component-scan base-package="com.qi.quartz">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>
    
    <bean id="taskExecutor" name="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">  
        <!-- 核心線程數 線程池維護線程的最少數量 -->
        <property name="corePoolSize" value="100" />  
        <!-- 線程池維護線程所容許的空閒時間 -->
        <property name="keepAliveSeconds" value="200" />  
        <!-- 線程池維護線程的最大數量 -->
        <property name="maxPoolSize" value="100" />  
        <!-- 線程池所使用的緩衝隊列 -->
        <property name="queueCapacity" value="500" /> 
        <!-- 線程池對拒絕任務(無線程可用)的處理策略 ThreadPoolExecutor.CallerRunsPolicy策略 ,調用者的線程會執行該任務,若是執行器已關閉,則丟棄.  -->
        <property name="rejectedExecutionHandler">
            <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
        </property> 
    </bean>  
    
</beans>

 

執行測試

./ab -n 1000 -c 1000 http://192.168.8.101:8080/QuartzDemo/test/execute

1000個請求,每次 1000個併發

結果

Server Software:        Apache-Coyote/1.1
Server Hostname:        192.168.8.101
Server Port:            8080

Document Path:          /QuartzDemo/test/execute
Document Length:        0 bytes

Concurrency Level:      1000
Time taken for tests:   22.452 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      121121 bytes
HTML transferred:       0 bytes
Requests per second:    44.54 [#/sec] (mean)
Time per request:       22452.351 [ms] (mean)
Time per request:       22.452 [ms] (mean, across all concurrent requests)
Transfer rate:          5.27 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        1  216 403.0     95    3035
Processing:   210 6209 6834.3   1431   21534
Waiting:      209 6208 6834.3   1431   21534
Total:        334 6425 7071.3   1529   22421

Percentage of the requests served within a certain time (ms)
  50%   1529
  66%  11318
  75%  11630
  80%  11830
  90%  21315
  95%  22316
  98%  22338
  99%  22353
 100%  22421 (longest request)

 

能夠看出僅用了22.452 秒,可是咱們的請求數卻高出了不少  1000*1000-100*100 = 990000。

固然了,至於開多少個線程,還要看機器如何了。

相關文章
相關標籤/搜索