使用线程池执行多线程需要如下几个条件

首先是一个线程池,线程池包含一些初始化数据,包含队列大小,核心线程数,最大线程数。

然后是一个实现了 runnable的任务,将该任务当如到线程池中进行执行。

 

线程池配置:

public class ThreadPoolManager<T> {

    /**
     * 根据cpu的数量动态的配置核心线程数和最大线程数
     */
    private static final int CPU_COUNT         = Runtime.getRuntime().availableProcessors();

    /**
     * 核心线程数 = CPU核心数 + 1
     */
    private static final int CORE_POOL_SIZE    = CPU_COUNT + 1;

    /**
     * 线程池最大线程数 = CPU核心数 * 2 + 1
     */
    private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;

    /**
     * 非核心线程闲置时超时1s
     */
    private static final int KEEP_ALIVE        = 1;


    private ThreadPoolExecutor executor;



    private ThreadPoolManager() {

    }

    private static ThreadPoolManager sInstance;

    public synchronized static ThreadPoolManager getsInstance() {
        if (sInstance == null) {
            sInstance = new ThreadPoolManager();
        }
        return sInstance;
    }


    /**
     * 开启一个无返回值的线程
     * @param r
     */
    public void execute(Runnable r) {
        if (executor == null) {
            /**
             * corePoolSize:核心线程数
             * maximumPoolSize:线程池所容纳最大线程数(workQueue队列满了之后才开启)
             * keepAliveTime:非核心线程闲置时间超时时长
             * unit:keepAliveTime的单位
             * workQueue:等待队列,存储还未执行的任务
             * threadFactory:线程创建的工厂
             * handler:异常处理机制
             *
             */
            executor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE,
                    KEEP_ALIVE, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1000),
                    Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
        }
        // 把一个任务丢到了线程池中
        executor.execute(r);
    }

    /**
     * 开启一个有返回结果的线程
     * @param r
     * @return
     */
    public Future<T> submit(Callable<T> r) {
        if (executor == null) {
            /**
             * corePoolSize:核心线程数
             * maximumPoolSize:线程池所容纳最大线程数(workQueue队列满了之后才开启)
             * keepAliveTime:非核心线程闲置时间超时时长
             * unit:keepAliveTime的单位
             * workQueue:等待队列,存储还未执行的任务
             * threadFactory:线程创建的工厂
             * handler:异常处理机制
             *
             */
            executor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE,
                    KEEP_ALIVE, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(20),
                    Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
        }
        // 把一个任务丢到了线程池中
        return executor.submit(r);
    }

    /**
     * 把任务移除等待队列
     * @param r
     */
    public void cancel(Runnable r) {
        if (r != null) {
            executor.getQueue().remove(r);
        }
    }

}

2. 然后 新建一个任务类,实现 runnable 接口,重写run方法

public class ConverterTask implements Runnable {

    


    @Override
    public void run() {
        //自己的业务逻辑,调用需要并发的方法
        //todo
    }
}

这样就可以简单的模拟一个线程池执行多线程的案例