1. 程式人生 > >java執行緒池配置以及使用

java執行緒池配置以及使用

applicationContext-threadpool.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
>
<!-- 執行緒池配置 --> <bean id="threadPoolTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!-- 執行緒池維護執行緒的最少數量 --> <property name="corePoolSize" value="50" /> <!-- 執行緒池維護執行緒的最大數量,預設為Integer.MAX_VALUE -->
<property name="maxPoolSize" value="1000" /> <!-- 執行緒池所使用的緩衝佇列,一般需要設定值>=notifyScheduledMainExecutor.maxNum;預設為Integer.MAX_VALUE --> <property name="queueCapacity" value="20000" /> <!-- 執行緒池維護執行緒所允許的空閒時間,預設為60s --> <property name="keepAliveSeconds"
value="300" />
<!-- 執行緒池對拒絕任務(無執行緒可用)的處理策略,目前只支援AbortPolicy、CallerRunsPolicy;預設為後者 --> <property name="rejectedExecutionHandler"> <!-- AbortPolicy:直接丟擲java.util.concurrent.RejectedExecutionException異常 --> <!-- CallerRunsPolicy:主執行緒直接執行該任務,執行完之後嘗試新增下一個任務到執行緒池中,可以有效降低向執行緒池內新增任務的速度 --> <!-- DiscardOldestPolicy:拋棄舊的任務、暫不支援;會導致被丟棄的任務無法再次被執行 --> <!-- DiscardPolicy:拋棄當前任務、暫不支援;會導致被丟棄的任務無法再次被執行 --> <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" /> </property> </bean> </beans>

線城市使用:執行緒池可以結合MQ來使用,也可以單獨使用,這裡展示和MQ結合使用

package com.zheng.api.server.jms;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

/**
 * MQ消費者
 * Created by shuzheng on 2017/2/19.
 */
public class DefaultMessageQueueListener implements MessageListener {

    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultMessageQueueListener.class);

    @Autowired
    ThreadPoolTaskExecutor threadPoolTaskExecutor;

    @Override
    public void onMessage(final Message message) {
        // 使用執行緒池多執行緒處理
        threadPoolTaskExecutor.execute(new Runnable() {
            @Override
            public void run() {
                if (message instanceof TextMessage) {
                    TextMessage textMessage = (TextMessage) message;
                    try {
                        LOGGER.info("消費:{}", textMessage.getText());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }

}