线程池(1)—— 线程池管理

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.sinosoft</groupId>
    <artifactId>ThreadPoolManage</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!-- jar 包依赖 -->
    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>


</project>

线程池管理:

package com.sinosoft;


import java.util.concurrent.*;

/**
 * @author xushuyi 2017/3/12.
 */
public class ThreadPoolManage {

    /**
     * 线程池维护线程的最少数量
     */
    private final static int CORE_POOL_SIZE = 10;
    /**
     * 线程池维护线程的最大数量
     */
    private final static int MAX_POOL_SIZE = 5000;
    /**
     * 线程池维护线程所允许的空闲时间
     */
    private final static int KEEP_ALIVE_TIME = 0;
    /**
     * 线程池所使用的缓冲队列大小
     */
    private final static int WORK_QUEUE_SIZE = 100;

    /**
     * 线程管理对象
     */
    private static ThreadPoolManage tpm = null;

    /**
     * 消息缓冲队列
     */
    private static final BlockingQueue<Object[]> QUEUE = new LinkedBlockingQueue<Object[]>();

    /**
     * 将任务放置队列 等待执行
     */
    final RejectedExecutionHandler handler = new RejectedExecutionHandler() {
        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            // 将数组任务对象加入到消息队列中
            if (!isEmpty(((ThreadRun) r).getObjArr())) {
                Object[] taskArr = (Object[]) ((ThreadRun) r).getObjArr();
                for (int i = 0; i < taskArr.length; i++) {
                    System.out.println("将数组集合任务对象:" + taskArr[i] + " 放入队列中重新等待执行");
                }
                QUEUE.offer((Object[]) ((ThreadRun) r).getObjArr());
            }
        }
    };

    /**
     * 创建线程池
     */
    @SuppressWarnings({"rawtypes", "unchecked"})
    final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
            CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME,
            TimeUnit.SECONDS, new ArrayBlockingQueue(WORK_QUEUE_SIZE), this.handler);

    /**
     * 调度线程池
     */
    final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(100);

    /**
     * 访问消息缓存的调度线程
     * 查看是否有待定请求,如果有,则创建一个新的AccessDBThread,并添加到线程池中
     */
    final Runnable accessBufferThread = new Runnable() {
        @Override
        public void run() {
            if (hasMoreAcquire()) {
                System.out.println("-》将缓存队列中的任务计划加入到线程池中...");
                Object[] obj = QUEUE.poll();
                Runnable task = new ThreadRun(obj);
                threadPool.execute(task);
            }
        }
    };

    /**
     * 开始执行调度线程池任务
     */
    @SuppressWarnings("rawtypes")
    final ScheduledFuture taskHandler = scheduler.scheduleAtFixedRate(this.accessBufferThread, 0, 1, TimeUnit.SECONDS);

    /**
     * 获取线程池管理对象
     *
     * @return ThreadPoolManage
     */
    public static ThreadPoolManage newInstance() {
        if (isEmpty(tpm)) {
            tpm = new ThreadPoolManage();
        }
        return tpm;
    }

    /**
     * 线程池构造器
     */
    private ThreadPoolManage() {
    }

    /**
     * 判断队列是否还有缓存任务
     *
     * @return Boolean
     */
    private boolean hasMoreAcquire() {
        return (!QUEUE.isEmpty());
    }

    /**
     * 添加任务 数组
     *
     * @param obj 任务
     */
    public void addTask(Object[] obj) {
        Runnable task = new ThreadRun(obj);
        threadPool.execute(task);
    }

    /**
     * 判断一个对象是否为空
     *
     * @param obj
     * @return
     */
    public static boolean isEmpty(Object obj) {
        if (("").equals(obj) || null == obj || "null".equals(obj) || obj.equals(null)) {
            return true;
        }
        return false;
    }

}

线程池任务调度执行:

package com.sinosoft;

import com.alibaba.fastjson.JSONObject;

/**
 * @author xushuyi 2017/3/12.
 */
public class ThreadRun implements Runnable {

    /**
     * 需要执行的数组任务对象
     */
    private Object[] objArr;

    /**
     * 构造器赋值
     *
     * @param objArr 任务对象
     */
    ThreadRun(Object[] objArr) {
        this.objArr = objArr;
    }

    /**
     * 开始执行
     */
    @Override
    public void run() {
        if (!isEmpty(objArr) && objArr.length > 0) {
            for (int i = 0; i < objArr.length; i++) {
                JSONObject taskJson = (JSONObject) JSONObject.toJSON(objArr[i]);
                String taskCode = (String) taskJson.get("taskCode");
                if ("001".equals(taskCode)) {
                    System.out.println("Object[] Start Task: " + taskJson.toString() + " Over.");
                }
            }
        }
    }

    /**
     * 获取要执行的任务对象
     *
     * @return 任务对象
     */
    public Object getObjArr() {
        return objArr;
    }

    /**
     * 判断一个对象是否为空
     *
     * @param obj
     * @return
     */
    public static boolean isEmpty(Object obj) {
        if (("").equals(obj) || null == obj || "null".equals(obj) || obj.equals(null)) {
            return true;
        }
        return false;
    }

}

测试主类:

package com.sinosoft;

import com.alibaba.fastjson.JSONObject;

import java.util.HashMap;
import java.util.Map;

/**
 * @author xushuyi 2017/3/12.
 */
public class ThreadPoolTest {

    /**
     * 获取线程池对象实例
     */
    ThreadPoolManage tpm = ThreadPoolManage.newInstance();

    /**
     * 开始调用线程池
     *
     * @param obj 数据对象
     */
    public void addTask(Object[] obj) {
        tpm.addTask(obj);
    }

    /**
     * 测试主方法
     *
     * @param args
     */
    public static void main(String[] args) {
        // 开始创建线程任务
        Object[] objArr = null;
        Integer num = 20;
        for (int i = 0; i <= num; i++) {
            Map<String, Object> taskMap = new HashMap();
            taskMap.put("taskCode", "001");
            taskMap.put("taskData", new Object[]{"xushuyi_" + i});
            objArr = new Object[]{JSONObject.toJSON(taskMap)};
            new ThreadPoolTest().addTask(objArr);
        }

    }
}

参考资料:

http://www.cnblogs.com/molao-doing/articles/4445045.html

转载于:https://www.cnblogs.com/xushuyi/articles/9076542.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值