文章目录
线程池
线程池主要用于控制运行的线程的数量。主要特点:线程复用,控制并发数,管理线程。
线程池的组成
- 线程池管理器:用于创建并管理线程池。
- 工作线程:线程池中的线程
- 任务接口: 每个任务必须实现的接口,用于工作线程调度其运行
- 任务队列:用于存放待处理的任务,提供一种缓冲机制。
创建线程池的几种方法
Java中创建线程池是通过Executors来进行创建。
newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回
收空闲线程,若无可回收,则新建线程。
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
例子:
//1.newCachedThreadPool创建一个可缓存线程池,如果当前线程池的长度超过了处理的需要
//时,它可以灵活的回收空闲的线程,当需要增加时, 它可以灵活的添加新的线程,而不会对池的
//长度作任何限制
// 创建无限大小线程池,由jvm自动回收
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
newCachedThreadPool.execute(new Runnable() {
public void run() {
try {
Thread.sleep(100);
} catch (Exception e) {
}
System.out.println("可缓存线程池"+Thread.currentThread().getName());
}
});
}
newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列
中等待。
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
例子:
//2.创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
newFixedThreadPool.execute(new Runnable() {
public void run() {
System.out.println("定长线程池"+Thread.currentThread().getName());
}
});
}
newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。
public static ScheduledExecutorService newScheduledThreadPool(
int corePoolSize, ThreadFactory threadFactory) {
返回新的 ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
}
例子
//3.创建一个固定长度的线程池
//定义线程池大小为3
ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(3);
for (int i = 0; i < 10; i++) {
最终整数温度 = i;
newScheduledThreadPool.schedule(new Runnable() {
public void run() {
System.out.println("固定长度的线程池"+Thread.currentThread().getName());
}
}, 3, TimeUnit.SECONDS);//这里表示延迟3秒执行。
}
4.创建一个单线程化的线程池,它只会用唯一的工作线程来执行任newSingleThreadExecutor
务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
public static ExecutorService newSingleThreadExecutor() {
返回新的可完成委派执行器服务
(new ThreadPoolExecutor(1, 1,
0L, 时间单位.毫秒,
new LinkedBlockingQueue<Runnable>()));
}
例子
//4.创建一个单线程化的线程池
ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
newSingleThreadExecutor.execute(new Runnable() {
public void run() {
System.out.println("单线程化的线程池"+Thread.currentThread().getName());
尝试 {
线程睡眠(200);
} catch (Exception e) {
}
}
});
}
自定义线程池
使用ThreadPoolExecutor自定义线程池,提供构造函数。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
长保持活力时间,
时间单位,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
构造函数参数的含义:
corePoolSize 核心线程数量
maximumPoolSize 最大线程数量
keepAliveTime 线程保持时间,N个时间单位
unit 时间单位(比如秒,分)
workQueue 阻塞队列
threadFactory 线程工厂
handler 线程池拒绝策略
例子
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 5, 60L,
TimeUnit.SECONDS, new ArrayBlockingQueue<>(3));
for (int i = 1; i <= 10; i++) {
executor.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}); //是执行线程方法
}
executor.shutdown() ;//不再接受新的任务,并且等待之前提交的任务都执行完再关闭,阻塞队列中的任务不会再执行。
}