线程池
1, 什么是线程池
线程池是指在初始化一个多线程应用程序过程中创建一个线程集合, 然后在需要执行新的任务时重用这些线程而不是新建一个线程. 线程池中线程的数量通常取决于可用内存数量和应用程序的需求. 线程池中的每个线程都有被分配一个任务, 一旦任务已经完成了, 线程回到池子中并等待下一次分配任务.
2, 线程池的作用
1线程池改进了一个应用程序的响应时间. 由于线程池中的线程已经准备好且等待被分配任务, 应用程序可以直接拿来使用而不用新建一个线程.
2线程池为每个短生存周期任务创建一个完整的线程的, 并可以在任务完成后回收资源.
3线程池根据当前在系统中运行的进程来优化线程时间片.
4线程池允许我们开启多个任务而不用为每个线程设置属性.
3,Java 提供的四种线程池
3.1,newCachedThreadPool
创建一个可缓存线程池, 如果线程池长度超过处理需要, 可灵活回收空闲线程, 若无可回收, 则新建线程.
- public class CachedThreadPoolDemo {
- public static void main(String[] args) {
- ExecutorService threadPool = Executors.newCachedThreadPool();
- for (int i = 1; i <= 10; i++) {
- final int index = i;
- threadPool.execute(new Runnable() {
- @Override
- public void run() {
- System.out.println(Thread.currentThread().getName() + "=====" + index);
- }
- });
- }
- }
- }
- 3.2,newFixedThreadPool
创建一个定长线程池, 可控制线程最大并发数, 超出的线程会在队列中等待.
- public class FixedThreadPoolDemo {
- public static void main(String[] args) {
- ExecutorService threadPool = Executors.newFixedThreadPool(3);
- for (int i = 1; i <= 10; i++) {
- final int index = i;
- threadPool.execute(() -> {
- System.out.println(Thread.currentThread().getName() + "=====" + index);
- });
- }
- }
- }
3.3,newScheduledThreadPool
创建一个定长线程池, 支持定时及周期性任务执行.
- public class ScheduledThreadPoolDemo {
- public static void main(String[] args) {
- ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(3);
- for (int i = 1; i <= 10; i++) {
- threadPool.schedule(new Runnable() {
- @Override
- public void run() {
- System.out.println(Thread.currentThread().getName() + ": 延迟 3 秒打印 log");
- }
- }, 3, TimeUnit.SECONDS);
- }
- }
- }
- 3.4,newSingleThreadExecutor
创建一个单线程化的线程池, 它只会用唯一的工作线程来执行任务, 保证所有任务按照指定顺序执行.
- public class SingleThreadExecutorDemo {
- public static void main(String[] args) {
- ExecutorService executorService = Executors.newSingleThreadExecutor();
- for (int i = 1; i <= 10; i++) {
- final int index = i;
- executorService.execute(new Runnable() {
- @Override
- public void run() {
- System.out.println(Thread.currentThread().getName() + "===" + index);
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- });
- }
- }
- }
源码地址 https://github.com/leil1230/JavaThreadLearn
来源: https://www.cnblogs.com/3LittleStones/p/12105520.html