/**
 * Created by 123 on 2018/2/26.
 *
 * 线程池的使用
 */

public class ThreadPool {


    /**
     * 线程池构造函数
     *
     * @corePoolSize 线程池之中核心线程数量
     *
     * @maximumPoolSize 线程池中最大线程数量
     *
     * @keepAliveTime 非核心线程超过限制时间,会被回收;
     *                如果ThreadPoolExecutor的allowCoreThreadTimeOut属性设置为true,
     *                则该参数也表示核心线程的超时时长。
     *
     * @unit 超时时长的单位
     *
     * @workQueue 线程池中的队列,储存已经被提交但是尚未执行的任务;
     *            存储在这里的任务是由ThreadPoolExecutor的execute方法提交来的。
     *
     * @threadFactory 为线程池提供新线程的功能,一般使用默认。
     *
     * @handler  拒绝策略,当线程无法执行新任务时
     *          (一般是由于线程池中的线程数量已经达到最大数或者线程池关闭导致的),
     *          默认情况下,当线程池无法处理新线程时,会抛出一个RejectedExecutionException。
     *
     * */
//    public  ThreadPoolExecutor(int corePoolSize,
//                              int maximumPoolSize,
//                              long keepAliveTime,
//                              TimeUnit unit,
//                              BlockingQueue<Runnable> workQueue,
//                              ThreadFactory threadFactory,
//                              RejectedExecutionHandler handler)



    /**
     * 新开一个线程之后的各种情况
     *
     * 1.execute一个线程之后,如果线程池中的线程数未达到核心线程数,则会立马启用一个核心线程去执行
     * 2.execute一个线程之后,如果线程池中的线程数已经达到核心线程数,且workQueue未满,则将新线程放入workQueue中等待执行
     * 3.execute一个线程之后,如果线程池中的线程数已经达到核心线程数但未超过非核心线程数,且workQueue已满,则开启一个非核心线程来执行任务
     * 4.execute一个线程之后,如果线程池中的线程数已经超过非核心线程数,则拒绝执行该任务
     */


    private ThreadPoolExecutor poolExecutor
            =new ThreadPoolExecutor(
                    3,
            5,
            1,
            TimeUnit.SECONDS,
            new LinkedBlockingDeque<Runnable>(128)
            );


    private void test(){

        Runnable runnable=new Runnable() {
            @Override
            public void run() {
                SystemClock.sleep(2000);
            }
        };
        poolExecutor.execute(runnable);
    }


    /**
     * 参数配置参考
     *
     * 核心线程数为手机CPU数量+1
     * (cpu数量获取方式Runtime.getRuntime().availableProcessors()),
     * 最大线程数为手机CPU数量×2+1,线程队列的大小为128
     * */


}