介绍几种常见的线程池
引言
ExecutorService 是java提供的管理线程池的类。主要用于控制线程的数量和重用线程。常用的线程池的参数:
corePoolSize :线程池的大小
maximumPoolSize:创建线程的最大数量
keepAliveTime :设置空闲线程的销毁时间
workQueue:阻塞队列,用来存储等待执行的任务决定了线程池的排队策略。主要取值:
ArrayBlockingQueue; 阻塞顺序队列
LinkedBlockingQueue; 基于链表实现的阻塞队列
SynchronousQueue;他实际上不是一个真正的队列,他不会为对中的元素维护存储空间
threadFactory 线程工厂,是用来创建线程的。
简单的创建一个线程池测试一下,这是一个可缓存的线程池。线程池为很大,当执行当前任务时上一个任务已经完成,会复用执行上一个任务的线程,而不用每次新建线程。
public static void main(String[] args) {
//创建一个可缓存的线程池
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//使用线程池的线程
executorService.execute(new Runnable() {
@Override
public void run() {
//打印正在执行的信息
System.out.println(Thread.currentThread().getName()+"正在执行");
}
});
}
}
创建一个可重用固定个数的线程池来测试一下
这里设置的线程的大小为3.
public static void main(String[] args) {
//创建一个可缓存的线程池
ExecutorService executorService = Executors.newFixedThreadPool(3);
for (int i = 0; i < 100; i++) {
try {
executorService.execute(new Runnable() {
@Override
public void run() {
//打印正在执行的信息
System.out.println(Thread.currentThread().getName()+"正在执行");
}
});
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//使用线程池的线程
}
}
/*
//执行结果
> pool-1-thread-1正在执行
pool-1-thread-2正在执行
pool-1-thread-3正在执行
pool-1-thread-1正在执行
pool-1-thread-2正在执行
pool-1-thread-3正在执行
pool-1-thread-1正在执行
pool-1-thread-2正在执行
pool-1-thread-3正在执行
pool-1-thread-1正在执行
pool-1-thread-2正在执行
pool-1-thread-3正在执行
pool-1-thread-1正在执行
pool-1-thread-2正在执行
*/
设置一个定长的线程池,支持定时,及周期性任务的执行。
public static void main(String[] args) {
//设置线程池大小为5
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);
//延迟5秒执行
scheduledExecutorService.schedule(new Runnable() {
@Override
public void run() {
System.out.println("延迟5秒执行");
}
},5, TimeUnit.SECONDS);
}
//设置执行周期
public static void main(String[] args) {
//设置线程池大小为5
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);
//延迟1秒每四秒执行一次
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+": 延迟1秒每4秒执行一次");
}
},1, 4, TimeUnit.SECONDS);
}
/*
执行结果
pool-1-thread-1: 延迟1秒每4秒执行一次
pool-1-thread-1: 延迟1秒每4秒执行一次
pool-1-thread-2: 延迟1秒每4秒执行一次
pool-1-thread-1: 延迟1秒每4秒执行一次
*/
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务.使用
Executors.newSingleThreadExecutor()来创建。这个就是按照任务的执行顺序来进行的。
public static void main(String[] args) {
//创建一个单线程化的线程池
ExecutorService scheduledExecutorService = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
int index = i;
scheduledExecutorService.execute(new Runnable() {
@Override
public void run() {
//输出当前线程的执行
try {
System.out.println(Thread.currentThread().getName()+"正在执行"+index);
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
/*
pool-1-thread-1正在执行0
pool-1-thread-1正在执行1
pool-1-thread-1正在执行2
pool-1-thread-1正在执行3
pool-1-thread-1正在执行4
pool-1-thread-1正在执行5
pool-1-thread-1正在执行6
pool-1-thread-1正在执行7
pool-1-thread-1正在执行8
pool-1-thread-1正在执行9
*/
总结
先了解怎么创建再说吧。