@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 未完待续