一、线程池基本概念 概念:
线程池主要是控制运⾏线程的数量,将待处理任务放到等待队列,然后创建线程执⾏这些任务。
如果超过了最⼤线程数,则等待。
为什么⽤线程池?
10年前单核CPU电脑,假的多线程,像⻢戏团⼩丑玩多个球,CPU需要来回切换。
现在是多核电脑,多个线程各⾃跑在独⽴的CPU上,不⽤切换效率⾼。
线程池的优点:
- 线程池做的⼯作只要是控制运⾏的线程数量,
- 处理过程中将任务放⼊队列,然后在线程创建后启动这些 任务,
- 如果线程数量超过了最⼤数量,超出数量的线程排队等候,等其他线程执⾏完毕,再从队列中取 出任务来执⾏。
线程池的主要特点为:
线程复⽤;控制最⼤并发数;管理线程。
1. 线程复⽤:不⽤⼀直new新线程,重复利⽤已经创建的线程来降低线程的创建和销毁开销,节省系 统资源。
2. 提⾼响应速度:当任务达到时,不⽤创建新的线程,直接利⽤线程池的线程。
3. 管理线程:可以控制最⼤并发数,控制线程的创建等。
体系:
Executor → ExecutorService → AbstractExecutorService → ThreadPoolExecutor 。
Thr eadPoolExecutor 是线程池创建的核⼼类。类似 Arrays 、 Collections ⼯具类, Executor 也有⾃⼰的⼯具类 Executors 。
二、线程池三种常⽤创建⽅式
Java中的线程池是通过Executor框架实现的,该框架中⽤到了Executor,Executors, ExecutorService,ThreadPoolExecutor这⼏个类。
newFixedThreadPool线程池
使⽤LinkedBlockingQueue 实现,定⻓线程池。
特点:执⾏⻓期任务性能好,创建⼀个线程池,⼀池有N个固定的线程,有固定线程数的线程
newSingleThreadExecutor线程池
使⽤ LinkedBlockingQueue 实现,⼀池只有⼀个线程。
特点:⼀个任务⼀个任务的执⾏,⼀池⼀线程
newCachedThreadPool线程池
使⽤ SynchronousQueue 实现,变⻓线程池。
特点:
执⾏很多短期异步任务,线程池根据需要创建新线程,但在先前构建的线程可⽤时将重⽤他们。
可扩容,遇强则强
三、线程池代码演示
package thread;
import java.util.concurrent.*;
/**
* 线程池代码演示
*/
public class ThreadPoolDemo {
public static void main(String[] args) {
//System.out.println("=======Fixed Thread Pool========");
// // ⼀个池⼦有5个⼯作线程,类似银⾏有5个受理窗⼝
//threadPoolTask( Executors.newFixedThreadPool(5) );
//System.out.println("======Single Thread Pool=========");
// // ⼀个池⼦有1个⼯作线程,类似银⾏有1个受理窗⼝
// threadPoolTask( Executors.newSingleThreadExecutor() );
// System.out.println("=====Cached Thread Pool=======");
// // 不定量线程,⼀个池⼦有N个⼯作线程,类似银⾏有N个受理窗⼝
// threadPoolTask( Executors.newCachedThreadPool() );
System.out.println(" =====Custom Thread Pool=======");
threadPoolTask(new ThreadPoolExecutor(
2,
5,
1L,
TimeUnit.SECONDS,
new LinkedBlockingQueue(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy()
));
}
private static void threadPoolTask(ExecutorService threadPool) {
//模拟有10个顾客来办理业务
try {
for (int i = 1; i {
System.out.println(Thread.currentThread().getName() + "\t办理业务");
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
threadPool.shutdown();
}
}
}
四、线程池创建的七个参数