线程池的使用及理解

483 阅读1分钟

@TOC

背景:最近代码中经常会用到线程池,看了一些别人的写法,公司也有一个线程池工具,可以通过界面配置的形式配置自己线程池的核心线程数、最大线程数和等待队列的长度

1、线程池关键概念

常用创建线程池方式:

// 创建指定线程个数的线程池
ExecutorService numberExecutor = Executors.newFixedThreadPool(100);

内部初始化逻辑:

2、线程池执行任务流程

线程池提交任务后的执行流程:

corePoolSize:核心线程个数
maximumPoolSize:最大线程个数
keepAliveTime、unit:线程等待时间及单位
workQueue:等待任务队列

3、提交任务形式

        // 方式一
        numberExecutor.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println("thread_run_submit");
            }
        });
        // 方式二
        numberExecutor.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("thread_run_execute");
            }
        });

这两种方式有什么区别呢,可以看一下源码

3.1、execute方法

execute()方法接收一个实现了Runnable接口的类,并且返回是void,也就是说没有返回值

3.2、submit方法

submit()有三种实现方式:
背景: Runnable接口只有一个run()方法,并且不带有返回值

Callable接口有一个call()方法,带有返回值

a、<T> Future<T> submit(Callable<T> task);  // 接收一个实现了Callable接口的task,这个方法带有返回值,可以通过Future来获取线程的信息
b、<T> Future<T> submit(Runnable task, T result); // 接收一个实现了Runnable接口的task,通过传入第二个参数来设定返回值类型
c、Future<?> submit(Runnable task); // future中返回值为null

4、线程池类型

// todo 未完待续